新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 软件工程、需求工程、系统工程,UML、MDA、模型驱动开发,面向对象软件工程、面向目标软件成功、面向场景的设计、敏捷
    [返回] 计算机科学论坛计算机技术与应用『 软件工程论坛 』 → Decorator模式不仅可以动态增加功能,而且可以动态减少功能 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7837 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Decorator模式不仅可以动态增加功能,而且可以动态减少功能 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     pennyliang 帅哥哟,离线,有人找我吗?白羊座1979-4-7
      
      
      威望:8
      等级:大二期末(C++考了100分!)
      文章:266
      积分:1911
      门派:Lilybbs.net
      注册:2005/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给pennyliang发送一个短消息 把pennyliang加入好友 查看pennyliang的个人资料 搜索pennyliang在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看pennyliang的博客楼主
    发贴心情 Decorator模式不仅可以动态增加功能,而且可以动态减少功能

    任何增加或者减少功能,都是通过类型改变实现的,包一个类型就是多一个功能,去掉外面这个包,就减少了功能,体系结构考试出了个题目,让我对decorator模式有了新的理解

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/2 20:01:00
     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客2
    发贴心情 
    我补充两句,油漆模式其实就是重写父类的方法,不过用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模式至此完成.

    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/3 10:05:00
     
     jiachong 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      等级:
      文章:227
      积分:1515
      门派:IEEE.ORG.CN
      注册:2004/11/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jiachong发送一个短消息 把jiachong加入好友 查看jiachong的个人资料 搜索jiachong在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看jiachong的博客3
    发贴心情 
    好像一般都叫:装饰模式吧
    而且这个例子似乎很难印证“动态”二字
    我倒觉得这么说的话Decorator模式和AOP倒是天生一对了,AOP可以帮助Decorator实现动态的方面添加或删除(需要支持运行时编织的运行环境,例如JBoss-AOP)
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/3 12:28:00
     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客4
    发贴心情 
    哦,和AOP一起用是可以的。不过这个模式的动态是指ArrayList的内容可以动态添加,只是一种模式,AOP是面向方面编程,是可以在方法体的前后添加额外代码段的,一般是处理日志。

    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/3 12:46:00
     
     pennyliang 帅哥哟,离线,有人找我吗?白羊座1979-4-7
      
      
      威望:8
      等级:大二期末(C++考了100分!)
      文章:266
      积分:1911
      门派:Lilybbs.net
      注册:2005/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给pennyliang发送一个短消息 把pennyliang加入好友 查看pennyliang的个人资料 搜索pennyliang在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看pennyliang的博客5
    发贴心情 
    我看了你的例子,你这个应该不是Decorator模式,SquarePeg 和 work不是is a 的关系。你包装来包装去,都是满足他们同样继承了work接口,这个是可以实现功能的动态添加和去除,实现和decorator一样的效果,但是decorator是的抽象基类和子类必须满足is a的关系,是通过继承,而不是接口继承实现的。我个人这样认为。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/4 17:27:00
     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 软件工程论坛 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客6
    发贴心情 
    这个例子是转贴的,你这样说的话我就确实不知道了,不如你贴一个例子大家来研究下。
    其实开发模式都是人们总结的,现在提出了23种开发模式,我认为就是要提出1000种也可以,这个并不是规范。


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

    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/5 9:55:00
     
     GoogleAdSense天秤座1980-10-9
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 软件工程论坛 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/24 0:13:33

    本主题贴数6,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    7,214.050ms