A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Lin0411 中级黑马   /  2014-5-4 08:43  /  1034 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Lin0411 于 2014-5-4 12:42 编辑

再学习设计模式的时候,提到装饰设计模式的装饰类和被装饰类都必须实现一个统一的接口,而在看毕老师视频的介绍装饰设计模式确实都继承了Reader类,那是不是如果都继承了同一个类也可称为是装饰设计模式?装饰设计模式能很好的解决由单纯利用继承所带来的代码臃肿的问题,那继承的优势又在哪里?为什么装饰设计模式能动态地为一个对象扩展功能?

6 个回复

倒序浏览
  1. 我是偷以前的资料给你看  哈哈

  2. 装饰模式:属于结构模式,动态地对一个对象进行功能上的扩展。

  3. 结构模式:用来处理类或对象的组合。
  4. -----------------------------------
  5. 装饰模式的构建方法:
  6. 1、抽象构件角色(Component):定义一个抽象接口,以规范准备接收附加责任的对象。
  7. 2、具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的类。
  8. 3、装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。
  9. 4、具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。
  10. -----------------------------------

  11. 通俗的说实现装饰模式的方法是:
  12. 1、装饰对象和真实对象有相同的接口;
  13. 也就是装饰角色和被装饰者有相同的抽象构件角色。
  14. 2、装饰对象包含一个真实对象的实例,并定义一个抽象构件的接口。
  15. 3、装饰对象接受所有来自客户端(具体装饰角色)的请求,并把这些请求转发给真实的对象。
  16. 4、装饰对象在转发这些请求以前或以后增加的一些附加功能时,不用修改真实对象的结构,就可以在外部增附加的功能(称为动态扩展)。
  17. 装饰模式结构模型:

  18. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19. 装饰模式的好处:
  20. 1、动态扩展功能使程序代码更易维护,避免修改的麻烦,为对象添加新功能更加方便、灵活。
  21. 2、使用装饰模式可以随时应对某个对象的变化,可以尽量少的去修改原代码,只需通过增加类或配置就可以完成变更,最大程度的保全了对象的原有结构。
  22. -----------------------------------

  23. 适用装饰模式的场合:
  24. 1、装饰模式适用于:当我们需要为某个现有的对象,动态的增加一个新功能或职责。
  25. 2、装饰模式常适用于某个对象的职责经常发生变化或经常需要动态增加职责。如果使用继承来扩展这些变化的职责,这样的话,子类会爆炸式地增长,膨胀速度过快,难以控制。(装饰模式与继承的区别)

  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27. 举例说明:


  28. //抽象构件
  29. public abstract class Person {
  30. public abstract void walk();//人这个类具有行走这个 抽象方法  
  31. }
  32. //真实类
  33. public class Man extends Person {

  34. @Override
  35. public void walk() {
  36. System.out.println(" Man人默认的行走方式是步行 ");
  37. }
  38. }
  39. //装饰类
  40. public abstract class DecoratorMan extends Person {

  41.     protected Person person;//定义一个抽象构件
  42.     public void setPerson(Person person) {
  43.         this.person = person;
  44.     }
  45.     @Override
  46.     public void walk() {
  47.         person.walk();
  48.     }
  49. }
  50. //具体装饰角色
  51. public class Superman extends DecoratorMan {

  52.     @Override
  53.     public void walk() {
  54.         super.walk();
  55.         System.out.println("超人加上能飞的行走方式");
  56.     }
  57. }

  58. //具体装饰角色
  59. public class Spiderman extends DecoratorMan {
  60.     @Override
  61.     public void walk() {
  62.         super.walk();
  63.         System.out.println("蜘蛛侠加上能跳的行走方式");
  64.     }
  65. }
  66. //测试类

  67. public class Test {

  68.     public static void main(String[] args) {

  69.         Man man = new Man();//创建一个Man实例对象
  70.         Superman superman = new Superman();
  71.         superman.setPerson(man);

  72.         Spiderman sipdeman = new Spiderman();
  73.         sipdeman.setPerson(superman);

  74.         sipdeman.walk();
  75.     }
  76. }
  77. 输出结果:

  78. Man人默认的行走方式是步行
  79. 超人加上能飞的行走方式
  80. 蜘蛛侠加上能跳的行走方式


复制代码
回复 使用道具 举报

里面没有我想要的答案。。。。。。
回复 使用道具 举报
本帖最后由 Silvester 于 2014-5-7 00:23 编辑

参考了csdn论坛上《解决星巴兹扩张快的问题》,这篇学习日志把装饰设计模式解释的很形象,觉得对楼主问题有帮助:http://blog.csdn.net/yan465942872/article/details/6420432
链接没添加上,还请楼主Ctrl+c:)



回复 使用道具 举报
装饰模式总结的很好,很细致
回复 使用道具 举报
路过长长知识~
回复 使用道具 举报
学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马