博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之Decorator
阅读量:6572 次
发布时间:2019-06-24

本文共 1665 字,大约阅读时间需要 5 分钟。

hot3.png

Decorator常被翻译成"装饰",油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的.

Decorator定义:

动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.

 

举个网上的例子:

 

在Decorator模式中,我们是要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类.

 

   

我们先建立一个接口:

public interface Work

  public void insert();

}

接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是无所谓.我们以插入方形桩为例:

public class SquarePeg implements Work{

  public void insert(){
    System.out.println("方形桩插入");
  }

}

现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木板,这些额外的功能是动态,可能随意增加调整修改,比如,可能又需要在打桩之后钉架子(只是比喻).

那么我们使用Decorator模式,这里方形桩SquarePeg是decoratee(被刷油漆者),我们需要在decoratee上刷些"油漆",这些油漆就是那些额外的功能.

public class Decorator implements Work{

  private Work work;

  //额外增加的功能被打包在这个List中
  private ArrayList others = new ArrayList();

  //在构造器中使用组合new方式,引入Work对象;

  public Decorator(Work work)
  {
    this.work=work;
   
    others.add("挖坑");

    others.add("钉木板");

  }

  public void insert(){

    newMethod();

  }

  
  //在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定的    
  public void newMethod()
  {
    otherMethod();
    work.insert();
  }

  public void otherMethod()

  {
    ListIterator listIterator = others.listIterator();
    while (listIterator.hasNext())
    {
      System.out.println(((String)(listIterator.next())) + " 正在进行");
    }
  }

}

在上例中,我们把挖坑和钉木板都排在了打桩insert前面,这里只是举例说明额外功能次序可以任意安排.

好了,Decorator模式出来了,我们看如何调用:

Work squarePeg = new SquarePeg(); 

Work decorator = new Decorator(squarePeg);
decorator.insert();

Decorator模式至此完成.

如果你细心,会发现,上面调用类似我们读取文件时的调用:

FileReader fr = new FileReader(filename);

BufferedReader br = new BufferedReader(fr);

实际上Java 的I/O API就是使用,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.

转载于:https://my.oschina.net/u/219582/blog/59459

你可能感兴趣的文章
Increasing the OpLog Size in MongoDB(don't need full resync)
查看>>
【MyBatis框架】SqlMapConfigl配置文件之常用的setting设置
查看>>
Oracle如何根据SQL_TEXT生成SQL_ID
查看>>
【Ajax技术】JQuery的应用与高级调试技巧
查看>>
mysql atlas 实现读写分离分担数据库压力
查看>>
掘金翻译计划 GitHub Star 破3千--终于等到你
查看>>
自定义圆环图表
查看>>
爬虫数据库一些简单的设计逻辑
查看>>
react native 处理iOS和安卓系统文字
查看>>
[北京昌平] 企名片寻找合适的伙伴,一起做数据,让数据不再难找难应用,做全球企业数据服务商...
查看>>
设计师学习HTML/CSS之路-08
查看>>
【分享】终端命令工具 自动生成vue组件文件以及修改router.js
查看>>
简单的移动端图片裁剪vue插件[旋转,平移,缩放,印花]
查看>>
时间管理的目标,永远不是「节省时间」,而是「找到自己」。
查看>>
分布式一致性算法-paxos详解与分析
查看>>
代理模式
查看>>
我们能用RNN写策略吗?
查看>>
SpringBoot高级篇JdbcTemplate之数据查询上篇
查看>>
Android 爱心万花筒简单实现
查看>>
常用正则表达式
查看>>