装饰模式

2017-04-12  本文已影响0人  棨帆

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

模式中的角色:

public abstract class Component {
    public abstract void Operation( );
}
public ConcreteComponent extends Component {
    public void Operation( ) {
        System.out.println("具体对象的操作");
    }
}
public class Decorator extends Component {

    protected Component component;
    public void Decorate (Component component){
        this.component = component;
    }
    
    public void Operation(){
        if (component != null){
            component.Operation();
        }
    }
}
public class ConcreteDecorator extends Decorator {

    private String addedState;
    public void Operation(){
        addedState = "New State";
        System.out.println("具体装饰对象的操作");       
    }
}
装饰模式

如果只有一个 ConcreteComponent 类,没有抽象的 Component 类,那么 Decorator 类可以是 ConcreteComponent 类的子类。

若只有一个 ConcreteDecorator 类,没有必要建立单独的 Decorator,将 Decorator 和 ConcreteDecorator 类的责任合并成一个类。

接下来,看一个具体实例:

Component 类:

public interface Coffee {  
    public double cost();  
}  

ConcreteComponent 类:

public class Espresso implements Coffee {  
    public double cost(){  
        return 2.5;  
    }  
}  

Decorator 类:

public class Dressing implements Coffee {  
    private Coffee coffee;  
      
    public Dressing(Coffee coffee){  
        this.coffee = coffee;  
    }  
      
    public double cost(){  
        return coffee.cost();  
    }  
}  

ConcretorDecorator 类:

public class Whip extends Dressing {  
    public Whip(Coffee coffee){  
        super(coffee);  
    }  
      
    public double cost(){  
        return super.cost() + 0.1;  
    }  
}  

public class Mocha extends Dressing {  
    public Mocha(Coffee coffee){  
        super(coffee);  
    }  
      
    public double cost(){  
        return super.cost() + 0.5;  
    }  
}  

装饰模式是为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码(新的字段、方法、逻辑)通常装饰了原有类的核心职责或主要行为,增加了主类的复杂度。
这些新加入的东西仅仅是满足一些只在某种特定情况下才会执行的特殊行为的需要。

装饰模式提供了非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这些类包装它所要装饰的对象。因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序的使用装饰功能包装对象。

优点:

需要注意的是:

上一篇 下一篇

猜你喜欢

热点阅读