为什么80%的码农都做不了架构师?>>>   

终于有时间写点什么了,可以前酝酿好的东西似乎一下子都忘记了。这几天看了wayfarer的《《让僵冷的翅膀飞起来》系列之三——从Adapter模式到Decorator模式》 后,感觉这样的文章真应当多发一些,激发思路。只是本来想用高级评论,却发现默认高级评论使用的是CuteEditor,在我的机器上根本无法使用,鼠标 始终是沙漏(不知道是不是跟防火墙有关),而自己又无法选择使用什么编辑器编辑高级评论,所以才不得不写篇文章说说我的想法,看来又要有劳dudu了。

当 初提出使用Decorator模式的是我,可现在提出异议的又是我,不要说我胡搅蛮缠,讨论中才能增长经验呀。wayfarer与idior的评论对我有 很大启发,但我发现现在似乎有些问题没有定义清楚,导致在探讨解决办法时模棱两可。第一,原有设计是否不允许有任何变动。wayfarer的文章中,似乎 默认是不允许对原有系统进行任何修改,而是通过增加新代码的方式提供新功能。否则以下的设计就应当能够解决问题了:

第 二,新增加的Resize方法是否与RM或MPEG的具体实现纠缠不清。如果Resize的实现相对独立,只要针对抽象VideoMedia中的方法和属 性就可以完成所有功能,那么使用Decorator模式无疑是个不错的选择,丑陋的"if (!(vedio is RM))"也可以不用出现在代码当中(具体可以参考wayfarer的原文)。设计如下:

因为SizeDecorator中的Resize方法只针对VideoMedia中的抽象方法执行操作,所以系统也就没有必要判断VideoMedia具体是RM还是MPEG,多态性自动替我们解决了这个问题。

但 是,正如wayfarer和idior所说的,Decorator并不适合为一个对象添加新功能。否则当对一个VideoMedia应用多个 Decorator时,从类型上讲用户只能看到最后一次Decorate时加入的新功能,以前的Decorator所起的作用被"屏蔽"了。

除 此之外,如果Resize方法依赖于具体的VideoMedia类型,那恐怕带来的就是灾难了。因为在编写Resize方法时,必须清楚的知道你是对RM 操作还是对MPEG操作,VideoMedia类型的_video也就形同虚设,丑陋的"if (!(vedio is RM))"也必不可免了。在这种情况下,还不如使用"类适配器模式"好(可以参考《《《让僵冷的翅膀飞起来》系列之二——从实例谈Adapter模式)。

第 三,Visitor模式是否可行?其实,如果将条件限定为不允许改变任何原有代码的化,Visitor模式根本没有用武之地。因为Visitor模式象踢 皮球一样需要一个"回传"功能,才能针对具体类型具体操作。可添加"回传(允许被Visit)"功能必须修改VideoMedia、RM与MPEG,这样 就违反了规则。

所以,我们应将尽量"针对抽象编程"。这样可以防止Resize方法过分依赖于具体。否则,不管使用哪种模式,都会"牺 牲"大量的代码。除此之外,当我们必须了解类型信息时,同时又要保证类型匹配(RMDecorator只能装饰RM)时,可以考虑使用抽象工厂(取其 意),将RMDecorator、与RM认为是一个产品族。

另外,如果需要动态为现有对象添加多个方法时,是否可以考虑使用 DynamicProxy,借助Mixin机制为一个类动态添加行为。但是我刚刚开始学习DynamicProxy、AOP和Mixin,感觉在需要我们 了解具体类型后再进行操作的场合下,这些机制似乎帮不了什么太大的忙。如果有这方面的高手,还望指点一二。

转载于:https://my.oschina.net/qihh/blog/57825

也说说“从Adapter模式到Decorator模式”相关推荐

  1. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  2. 结构型模式之Decorator模式

    1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活 2.适用性 以下情况使用Decorator模式 (1)在不影响期货对象的情况下,以动态.透明的 ...

  3. 一天一模式:Decorator模式

    这个模式的核心应该是在于将需要扩展功能的类给包装起来,并且包装类继承自需要扩展的类,并且重写类,来达到对对象动态扩展功能的目的. 转载于:https://www.cnblogs.com/ChinaPg ...

  4. Decorator模式------装饰边框与被装饰物的一致性

    1. >>不断地为对象装饰的设计模式称为Decorator 模式. 2. 示例程序 >>功能:给文字添加装饰边框.这里所谓的装饰边框是指用" - " &qu ...

  5. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  6. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  7. 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)

    [笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...

  8. GOF 设计模式 Decorator模式 笔记

    Decorator(装饰) 意图:动态的给一个对象添加一些额外的职责.就添加功能来说,Decorator模式相比生成子类更为灵活 结构图: 在以下情况适合使用 在不影响其他对象的情况下,以动态,透明的 ...

  9. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

最新文章

  1. ZooKeeper客户端地址列表的随机原理
  2. (转)安装黑苹果 MAC OS X Lion 10.7.2过程 (未验证)
  3. Tensorflow 2.1.0 中 keras.utils.plot_model()出错的解决方法
  4. fifo算法模拟_[源码和文档分享]基于C++的请求分页虚拟页面替换算法
  5. ajax包含mysql吗_php 实例ajax与mysql怎么只查询出一条数据?
  6. JSONObject 自定义过滤配置
  7. 【Python成长之路】python 基础篇 -- 装饰器【华为云分享】
  8. c# Linq实现 获得某一个路径下所有文件的名(不含扩展名)
  9. Android NDK之JNI陷阱
  10. python字典数据长度_从0开始学python-3.2 字典与数据总结
  11. 腾讯随星播 v2.2.1 官方版​
  12. spring不停机部署_关于不停机部署方案的选择
  13. Linux中断原理、上半部和下半部、硬中断和软中断
  14. 浅析ERP系统--质量
  15. 订单流失总金额怎么算_微信新规下增长乏力,裂变到底该怎么做?
  16. Objective-C分类 (catagory)
  17. 东周列国志美文摘录-晏平仲巧辩服荆蛮
  18. 如何用vba把word文档的每页单独保存为一个word文档
  19. c语言大学生自学网教学视频,6个质量最高的自学网站,悄悄的提成能力!
  20. 互联网公司分布式集群架构图入门解析(简单通俗易懂,超详细)

热门文章

  1. SpringMVC中@GetMapping和@RequestMapping的区别
  2. 标准非STL容器 : bitset
  3. DNS扫盲系列之五:域名配置ZONE文件
  4. HDU1272_并查集
  5. System.Threading.Interlocked.Exchange(ref m_Value, value);
  6. 【干货】五天,谷歌如何制作一款App?
  7. 【运营干货】三分钟,读懂互联网运营
  8. 语音助手们——功能未动,趣味先行
  9. Docker(二)安装及常用命令
  10. jQuery-Easyui 1.2 实现多层菜单