设计模式(3)-结构型-装饰模式(Decorator)
2016-07-09 03:55
495 查看
意图:
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。
个人理解:
结合代码注释理解。
适用性:
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
处理那些可以撤消的职责。
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
简单代码,便于理解:
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。
个人理解:
结合代码注释理解。
适用性:
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
处理那些可以撤消的职责。
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
简单代码,便于理解:
//抽象类 public interface Component { public void sampleOperation(); } //具体实现类A public class ConcreteComponentA implements Component { @Override public void sampleOperation() { // 写相关的业务代码,不同于B } } //具体实现类B public class ConcreteComponentB implements Component { @Override public void sampleOperation() { // 写相关的业务代码,不同于A } } //装饰类/委托类 //实现统一接口,用于将具体实现类委托给装饰类。 //根据接口注入具体实现类,完成委托,便于装饰。 //装饰类让具体实现类与具体装饰类在互不影响的情况下完成功能的增删改。 public class Decorator implements Component{ private Component component; public Decorator(Component component){ this.component = component; } @Override public void sampleOperation() { // 委派给构件,只做委托,不做其他操作。 component.sampleOperation(); } } //具体装饰类A。 //可有多种装饰类,每种装饰类统一增加所有具体实现类的部分功能。 public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { //注入具体实现类 super(component); } @Override public void sampleOperation() { super.sampleOperation(); //在具体实现类的基础上新增操作 } } //具体装饰类B //可有多种装饰类,每种装饰类统一增加所有具体实现类的部分功能。 public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void sampleOperation() { super.sampleOperation(); //在具体实现类的基础上新增操作 } } //使用方式 //可以看出,装饰模式最大的优势就在于动态的组合具体装饰类与具体实现类。 //当组合模式变多时,使用装饰远远优于使用继承。 public static void main(String[] args) { //AA组合 ConcreteDecoratorA AA = new ConcreteDecoratorA(new ConcreteComponentA()); //AB组合 ConcreteDecoratorA AB = new ConcreteDecoratorA(new ConcreteComponentB()); //BA组合 ConcreteDecoratorB BA = new ConcreteDecoratorB(new ConcreteComponentA()); //BB组合 ConcreteDecoratorB BB = new ConcreteDecoratorB(new ConcreteComponentB()); }
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用