装饰模式

  装饰模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

  

  我们来看基本的代码实现:

  Component类:

  

1 package decorator;
2 
3 public abstract class Componnent {
4     public abstract void operation();
5 }

  ConcreatComponent类:

  

1 public class ConcreatComponent extends Componnent{
2 
3     @Override
4     public void operation() {
5         System.out.println("具体对象的操作");
6     }
7     
8 }

  Decorator类:

  

 1 public abstract class Decorator extends Componnent{
 2     
 3     protected Componnent componnent;
 4     
 5     
 6 
 7     @Override
 8     public void operation() {
 9         if(componnent != null){
10             componnent.operation();
11         }
12     }
13 
14 
15 
16     public void setComponnent(Componnent componnent) {
17         this.componnent = componnent;
18     }
19     
20 }

  DecoratorA类:

  

 1 public class DecoratorA extends Decorator{
 2     
 3     private String addState;
 4 
 5     @Override
 6     public void operation() {
 7         super.operation();
 8         addState = "i am a ";
 9         System.out.println("具体对象A的操作");
10     }
11     
12 }

  DecoratorB类:

  

 1 public class DecoratorB extends Decorator{
 2 
 3     @Override
 4     public void operation() {
 5         super.operation();
 6         addBehavior();
 7     }
 8     
 9     private void addBehavior(){
10         System.out.println("具体对象B的操作");
11     }
12     
13 }

  客户端调用:

  

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         ConcreatComponent concreatComponent = new ConcreatComponent();
 4         DecoratorA decoratorA = new DecoratorA();
 5         DecoratorB decoratorB = new DecoratorB();
 6         
 7         decoratorA.setComponnent(concreatComponent);
 8         decoratorB.setComponnent(decoratorA);
 9         
10         decoratorB.operation();
11     }
12 }

装饰者模式的应用场景:
1、 想透明并且动态地给对象增加新的职责的时候。
2、 给对象增加的职责,在未来存在增加或减少可能。
3、 用继承扩展功能不太现实的情况下,应该考虑用组合的方式。

装饰者模式的优点:
1、 通过组合而非继承的方式,实现了动态扩展对象的功能的能力。
2、 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
3、 充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点。
4、 装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的。
5、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

装饰者模式的缺点:
1、 装饰链不能过长,否则会影响效率。
2、 因为所有对象都是Component,所以如果Component内部结构发生改变,则不可避免地影响所有子类(装饰者和被装饰者),也就是说,通过继承建立的关系总是脆弱地,如果基类改变,势必影响对象的内部,而通过组合(Decoator HAS A Component)建立的关系只会影响被装饰对象的外部特征。
3、只在必要的时候使用装饰者模式,否则会提高程序的复杂性,增加系统维护难度。

posted @ 2012-10-24 11:22  寒剑飘香  阅读(135)  评论(0编辑  收藏  举报