分享

《Head First设计模式》阅读笔记.第三章...

 昵称465563 2010-10-27
1.装饰者(Decorator)模式部分

*利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为。

*利用继承扩展子类的行为,是在编译时静态决定的;利用组合的做法,可以在运行时动态地扩展对象的行为。

软件设计原则:类应该对扩展开放,对修改关闭。这就是我们常说的开放-关闭原则。

*开放-关闭原则使类容易扩展,在不修改代码的情况下,通过搭配实现新的行为。这样的设计可以应对改变,比如增加新功能或需求发生变更。

OO设计技巧:允许系统在不修改代码的情况下,进行功能扩展。

*装饰者模式:动态地将责任加到对象身上。如果要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。

*装饰者模式中,装饰者可以在被装饰者的行为之前或之后,加上自己的行为,以实现特性的目的。

*装饰者模式的几个缺点:
(1)有时在设计中加入大量的小类,变得不容易理解。
(2)有的客户端代码依赖于特定的类型(这是个比较糟糕的习惯,违反了“针对接口编程,而不是针对实现编程”的设计原则),当服务器端引入装饰者模式时,客户端就会出现状况。
(3)装饰者模式使得实例化组件的复杂度提升。
PS:工厂(Factory)模式和生成器(Builder)模式对于装饰者(Decorator)模式的这些缺点会有所帮助。

*遵循开放-关闭原则设计系统,努力使关闭的部分(不变)和开放的部分(变化)隔离开来。

2.装饰者(Decorator)模式实例
Java代码 复制代码
  1. public abstract class Car {   
  2.     String name = "Unknow Car";   
  3.   
  4.     public String getName() {   
  5.         return this.name;   
  6.     }   
  7.   
  8.     public abstract float cost();   
  9. }   
  10.   
  11. // 标准型Benz汽车   
  12. public class BenzCar extends Car {   
  13.     public BenzCar() {   
  14.         this.name = "Benz";   
  15.     }   
  16.   
  17.     @Override  
  18.     public float cost() {   
  19.         return 100 * 10000.00f;   
  20.     }   
  21. }   
  22.   
  23. // 标准型BMW汽车   
  24. public class BmwCar extends Car {   
  25.     public BmwCar() {   
  26.         this.name = "BMW";   
  27.     }   
  28.   
  29.     @Override  
  30.     public float cost() {   
  31.         return 50 * 10000.00f;   
  32.     }   
  33. }   
  34.   
  35. // 标准QQ汽车   
  36. public class QQCar extends Car {   
  37.     public QQCar() {   
  38.         this.name = "QQ";   
  39.     }   
  40.   
  41.     @Override  
  42.     public float cost() {   
  43.         return 3 * 10000.00f;   
  44.     }   
  45. }   
  46.   
  47. // 配件装饰者   
  48. public abstract class AccesoryDecorator extends Car {   
  49.     public abstract String getName();   
  50. }   
  51.   
  52. // 安全气囊配件   
  53. public class AirbagAccesory extends AccesoryDecorator {   
  54.     private Car car;   
  55.   
  56.     public AirbagAccesory(Car car) {   
  57.         this.car = car;   
  58.     }   
  59.   
  60.     @Override  
  61.     public String getName() {   
  62.         return car.getName() + ",Airbag";   
  63.     }   
  64.   
  65.     @Override  
  66.     public float cost() {   
  67.         return car.cost() + 1500;   
  68.     }   
  69. }   
  70.   
  71. // 摄像头配件   
  72. public class CameraAccesory extends AccesoryDecorator {   
  73.     private Car car;   
  74.   
  75.     public CameraAccesory(Car car) {   
  76.         this.car = car;   
  77.     }   
  78.   
  79.     @Override  
  80.     public String getName() {   
  81.         return car.getName() + ",Camera";   
  82.     }   
  83.   
  84.     @Override  
  85.     public float cost() {   
  86.         return car.cost() + 800;   
  87.     }   
  88. }   
  89.   
  90. // 收音机配件   
  91. public class RadioAccesory extends AccesoryDecorator {   
  92.     private Car car;   
  93.   
  94.     public RadioAccesory(Car car) {   
  95.         this.car = car;   
  96.     }   
  97.   
  98.     @Override  
  99.     public String getName() {   
  100.         return car.getName() + ",Radio";   
  101.     }   
  102.   
  103.     @Override  
  104.     public float cost() {   
  105.         return car.cost() + 600;   
  106.     }   
  107. }  

Java代码 复制代码
  1. // 测试程序   
  2. public class Test {   
  3.     public static void main(String[] args) {   
  4.         Car car1 = new RadioAccesory(new AirbagAccesory(new CameraAccesory(new BenzCar())));   
  5.         printCarInfo(car1);   
  6.   
  7.         Car car2 = new AirbagAccesory(new CameraAccesory(new BmwCar()));   
  8.         printCarInfo(car2);   
  9.   
  10.         Car car3 = new RadioAccesory(new QQCar());   
  11.         printCarInfo(car3);   
  12.     }   
  13.   
  14.     public static void printCarInfo(Car car) {   
  15.         System.out.println("Car Name:" + car.getName() + ",Cost:" + car.cost());   
  16.     }   
  17. }  


测试程序运行结果:
Java代码 复制代码
  1. Car Name:Benz,Camera,Airbag,Radio,Cost:1002900.0  
  2. Car Name:BMW,Camera,Airbag,Cost:502300.0  
  3. Car Name:QQ,Radio,Cost:30600.0  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多