Android 设计模式:(三)装饰者模式 —— 装饰对象
2012-05-29 18:29
465 查看
*利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为。
*利用继承扩展子类的行为,是在编译时静态决定的;利用组合的做法,可以在运行时动态地扩展对象的行为。
软件设计原则:类应该对扩展开放,对修改关闭。这就是我们常说的开放-关闭原则。
*开放-关闭原则使类容易扩展,在不修改代码的情况下,通过搭配实现新的行为。这样的设计可以应对改变,比如增加新功能或需求发生变更。
OO设计技巧:允许系统在不修改代码的情况下,进行功能扩展。
*装饰者模式:动态地将责任加到对象身上。如果要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。
*装饰者模式中,装饰者可以在被装饰者的行为之前或之后,加上自己的行为,以实现特性的目的。
*装饰者模式的几个缺点:
(1)有时在设计中加入大量的小类,变得不容易理解。
(2)有的客户端代码依赖于特定的类型(这是个比较糟糕的习惯,违反了“针对接口编程,而不是针对实现编程”的设计原则),当服务器端引入装饰者模式时,客户端就会出现状况。
(3)装饰者模式使得实例化组件的复杂度提升。
PS:工厂(Factory)模式和生成器(Builder)模式对于装饰者(Decorator)模式的这些缺点会有所帮助。
*遵循开放-关闭原则设计系统,努力使关闭的部分(不变)和开放的部分(变化)隔离开来。
装饰者(Decorator)模式实例
*利用继承扩展子类的行为,是在编译时静态决定的;利用组合的做法,可以在运行时动态地扩展对象的行为。
软件设计原则:类应该对扩展开放,对修改关闭。这就是我们常说的开放-关闭原则。
*开放-关闭原则使类容易扩展,在不修改代码的情况下,通过搭配实现新的行为。这样的设计可以应对改变,比如增加新功能或需求发生变更。
OO设计技巧:允许系统在不修改代码的情况下,进行功能扩展。
*装饰者模式:动态地将责任加到对象身上。如果要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。
*装饰者模式中,装饰者可以在被装饰者的行为之前或之后,加上自己的行为,以实现特性的目的。
*装饰者模式的几个缺点:
(1)有时在设计中加入大量的小类,变得不容易理解。
(2)有的客户端代码依赖于特定的类型(这是个比较糟糕的习惯,违反了“针对接口编程,而不是针对实现编程”的设计原则),当服务器端引入装饰者模式时,客户端就会出现状况。
(3)装饰者模式使得实例化组件的复杂度提升。
PS:工厂(Factory)模式和生成器(Builder)模式对于装饰者(Decorator)模式的这些缺点会有所帮助。
*遵循开放-关闭原则设计系统,努力使关闭的部分(不变)和开放的部分(变化)隔离开来。
装饰者(Decorator)模式实例
public abstract class Car { String name = "Unknow Car"; public String getName() { return this.name; } public abstract float cost(); } // 标准型Benz汽车 public class BenzCar extends Car { public BenzCar() { this.name = "Benz"; } @Override public float cost() { return 100 * 10000.00f; } } // 标准型BMW汽车 public class BmwCar extends Car { public BmwCar() { this.name = "BMW"; } @Override public float cost() { return 50 * 10000.00f; } } // 标准QQ汽车 public class QQCar extends Car { public QQCar() { this.name = "QQ"; } @Override public float cost() { return 3 * 10000.00f; } } // 配件装饰者 public abstract class AccesoryDecorator extends Car { public abstract String getName(); } // 安全气囊配件 public class AirbagAccesory extends AccesoryDecorator { private Car car; public AirbagAccesory(Car car) { this.car = car; } @Override public String getName() { return car.getName() + ",Airbag"; } @Override public float cost() { return car.cost() + 1500; } } // 摄像头配件 public class CameraAccesory extends AccesoryDecorator { private Car car; public CameraAccesory(Car car) { this.car = car; } @Override public String getName() { return car.getName() + ",Camera"; } @Override public float cost() { return car.cost() + 800; } } // 收音机配件 public class RadioAccesory extends AccesoryDecorator { private Car car; public RadioAccesory(Car car) { this.car = car; } @Override public String getName() { return car.getName() + ",Radio"; } @Override public float cost() { return car.cost() + 600; } }
// 测试程序 public class Test { public static void main(String[] args) { Car car1 = new RadioAccesory(new AirbagAccesory(new CameraAccesory(new BenzCar()))); printCarInfo(car1); Car car2 = new AirbagAccesory(new CameraAccesory(new BmwCar())); printCarInfo(car2); Car car3 = new RadioAccesory(new QQCar()); printCarInfo(car3); } public static void printCarInfo(Car car) { System.out.println("Car Name:" + car.getName() + ",Cost:" + car.cost()); } }
// 测试结果 Car Name:Benz,Camera,Airbag,Radio,Cost:1002900.0 Car Name:BMW,Camera,Airbag,Cost:502300.0 Car Name:QQ,Radio,Cost:30600.0
相关文章推荐
- Android 设计模式:(三)装饰者模式 —— 装饰对象
- Android 设计模式:(三)装饰者模式 —— 装饰对象
- 面向对象设计模式之Decorator装饰模式(结构型)
- 【设计模式】装饰者模式-明月装饰了你的窗子
- 3. 装饰者模式:装饰对象
- Android 设计模式之装饰者模式
- Android设计模式之装饰模式
- Android 进阶之路:常见设计模式之装饰模式
- 设计模式(Design Patterns)-可复用面向对象软件的基础 07:装饰模式(Decorator)
- 谈谈有关设计模式的思想精髓:变继承关系为组合关系、如何创建对象(单例、状态、装饰者模式)
- Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)
- Android 内功心法(1.9)——java设计模式之装饰模式
- 面向对象设计模式之结构型模式(一):装饰者模式
- 对象结构型设计模式之装饰模式· 重要等级3 难度等级3
- 黑马程序员--字符流缓冲区对象,装饰设计模式,字节流,字节流的缓冲区对象,转换流对象
- 设计模式十:decorator(装饰)——对象结构型模式
- 【设计模式】装饰者模式-明月装饰了你的窗子
- Android设计模式之装饰器模式
- 结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)
- 生拉硬套设计模式(一),关于装饰者模式在Android项目中的运用。