设计模式之装饰者模式

1、设计原则  对“修改”关闭    对“扩展”开放

                                  如果增加新功能,可以在上面进行扩展,而不是修改原来已经编写的部分。

2、装饰者模式定义:

                                 动态的将责任附加到对象中。若要扩展功能,装饰者提供比继承更有弹性的替代方案。

理解:

            1、 装饰者A和B可以实现对ConcreateComponent的动态扩展,只需保存一个超类的引用即Component的引用,这样可以实现对原方法methodA()和methodB()的重新扩展。 因为每个装饰者对象都有一个超类的引用,也就是被装饰者的引用,那么自然可以通过它调用原方法,如ConcreateComponent的methodA()或B ;

    扩展methodA()的办法是所有装饰者有一个共同的抽象接口,也就是Decorator,里面声明methodA(),那么其子类就必须重写,也就实现了扩展。

            2、对比直接继承,即如果ConcreateDecorator直接继承自ConcreateComponent相比,结构更清晰、而且可以动态扩展

            3、装饰者具有超类或者说是被装饰对象特征的办法是将其作为装饰者的构造函数参数。

            4、要扩展方法一定要在装饰者接口中重新声明以便子类重写进行覆盖。

            5、装饰者接口的作用就是,继承Component以便具有其类型,以及限定扩展的方法

思考:

           由于装饰者的子类必须具有Component的引用,这个引用在Decorator中声明以及构造函数实现  对比   在每个子类分别声明实现有什么不同吗,为什么headfirst使用后面的办法。

package com.decorator;

public abstract class Beverage {
    String description = "Unkonow Description";

    protected String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
    
    protected abstract double cost();

}
package com.decorator;

public abstract class CondimentDecorator extends Beverage{
    Beverage beverage;
    public CondimentDecorator(Beverage beverage){
        this.beverage = beverage;
    }
    protected abstract String getDescription();
}
package com.decorator;

public class Espresso extends Beverage{
    public Espresso(){
        this.description = "Espresso";
    }

    @Override
    protected double cost() {
        // TODO Auto-generated method stub
        return 0.1;
    }

}
package com.decorator;

public class HouseBlend extends Beverage{
    public HouseBlend(){
        this.description = "HouseBlend";
    }

    @Override
    protected double cost() {
        // TODO Auto-generated method stub
        return 0;
    }

}
package com.decorator;

public class Mocha extends CondimentDecorator{
//    Beverage beverage;
//    public Mocha(Beverage beverage){
//        this.beverage = beverage;
//    }

    public Mocha(Beverage beverage) {
        super(beverage);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected String getDescription() {
        // TODO Auto-generated method stub
        return beverage.getDescription() + ",Mocha";
    }

    @Override
    protected double cost() {
        // TODO Auto-generated method stub
        return beverage.cost() + 0.9;
    }

}
package com.decorator;

public class Sop extends CondimentDecorator{
//    Beverage beverage;
//    public Sop(Beverage beverage){
//        this.beverage = beverage;
//    }

    public Sop(Beverage beverage) {
        super(beverage);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected String getDescription() {
        // TODO Auto-generated method stub
        return this.beverage.getDescription() + ",Sop";
    }

    @Override
    protected double cost() {
        // TODO Auto-generated method stub
        return 0.888 + beverage.cost();
    }

}
package com.decorator;

public class DecoratorTest {
    public static void main(String args[]){
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription());
        beverage = new Sop(beverage);
        System.out.println(beverage.getDescription());
        beverage = new Mocha(beverage);
        System.out.println(beverage.getDescription());
    }

}

 

 思考:

posted on 2017-07-19 20:12  笑傲江湖未平生  阅读(128)  评论(0编辑  收藏  举报