科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件java设计模式之 Decorator(装饰)

java设计模式之 Decorator(装饰)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
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就是使用Decorator实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.
  
  Jive中的Decorator实现
  在论坛系统中,有些特别的字是不能出现在论坛中如"打倒XXX",我们需要过滤这些"反动"的字体.不让他们出现或者高亮度显示.
  
  在IBM Java专栏中专门谈Jive的文章中,有谈及Jive中ForumMessageFilter.java使用了Decorator模式,其实,该程序并没有真正使用Decorator,而是提示说:针对特别论坛可以设计额外增加的过滤功能,那么就可以重组ForumMessageFilter作为Decorator模式了.
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章