以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 软件工程论坛 』   (http://bbs.xml.org.cn/list.asp?boardid=48)
----  Decorator模式不仅可以动态增加功能,而且可以动态减少功能  (http://bbs.xml.org.cn/dispbbs.asp?boardid=48&rootid=&id=29791)


--  作者:pennyliang
--  发布时间:4/2/2006 8:01:00 PM

--  Decorator模式不仅可以动态增加功能,而且可以动态减少功能
任何增加或者减少功能,都是通过类型改变实现的,包一个类型就是多一个功能,去掉外面这个包,就减少了功能,体系结构考试出了个题目,让我对decorator模式有了新的理解
--  作者:wcdxyl
--  发布时间:4/3/2006 10:05:00 AM

--  
我补充两句,油漆模式其实就是重写父类的方法,不过用ArrayList来动态定义要油漆的内容而已。 我贴一段java代码给大家参考:

我们先建立一个接口:
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模式至此完成.


--  作者:jiachong
--  发布时间:4/3/2006 12:28:00 PM

--  
好像一般都叫:装饰模式吧
而且这个例子似乎很难印证“动态”二字
我倒觉得这么说的话Decorator模式和AOP倒是天生一对了,AOP可以帮助Decorator实现动态的方面添加或删除(需要支持运行时编织的运行环境,例如JBoss-AOP)
--  作者:wcdxyl
--  发布时间:4/3/2006 12:46:00 PM

--  
哦,和AOP一起用是可以的。不过这个模式的动态是指ArrayList的内容可以动态添加,只是一种模式,AOP是面向方面编程,是可以在方法体的前后添加额外代码段的,一般是处理日志。


--  作者:pennyliang
--  发布时间:4/4/2006 5:27:00 PM

--  
我看了你的例子,你这个应该不是Decorator模式,SquarePeg 和 work不是is a 的关系。你包装来包装去,都是满足他们同样继承了work接口,这个是可以实现功能的动态添加和去除,实现和decorator一样的效果,但是decorator是的抽象基类和子类必须满足is a的关系,是通过继承,而不是接口继承实现的。我个人这样认为。
--  作者:wcdxyl
--  发布时间:4/5/2006 9:55:00 AM

--  
这个例子是转贴的,你这样说的话我就确实不知道了,不如你贴一个例子大家来研究下。
其实开发模式都是人们总结的,现在提出了23种开发模式,我认为就是要提出1000种也可以,这个并不是规范。


[此贴子已经被作者于2006-4-5 13:02:15编辑过]

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms