23种设计模式之装饰者模式

    今天我来向大家讲解一下装饰者模式,装饰者模式的设计原则同样也是对扩展开放,对修改关闭,那我们就有了一个问题,如何做到对修改关闭,对扩展开放呢?

    我们都知道,装饰者模式的定义是动态地将责任附加到对象中,其实装饰者模式也可以说是动态嵌套的一个过程。就比如举例来说,假如我现在到一个商店中买了一杯牛奶咖啡,这里我们用到的装饰者模式的地方就是,我的牛奶装饰了咖啡,也可以说咖啡装饰了牛奶,因为装饰者模式是可以相互嵌套的。当然,当我的牛奶装饰咖啡的时候,我需要有一个判断,因为我要付钱给老板,我的牛奶和咖啡是分开算钱的,那我就需要一个抽象父类来使得我的牛奶类和咖啡类来继承,其中贯穿整个代码的cost()方法来计算牛奶和咖啡的钱。

    下面是装饰者模式的一个类图,相信看了下面的类图你会有一定了解,这个里面的CondientDecorator这个抽象类可以不写,也不会影响整个模式。看到了这个模式之后,相信我们可以自己写出来,下面是代码展示。

    


首先,我们现需要写一个抽象基类Beverage。

package food;
public abstract class Beverage {

String description  ="None";
double cost = 0.0;
String size = null;
public String getDescription(){

return description;
}

public abstract double cost();

}

接下来,我们需要我们的子类HouseBlend继承抽象基类Beverage。

package food;


public class HouseBlend extends Beverage{


public HouseBlend(){
description = "HouseBlend";

}

public double cost(){
return 1.00;
}

}


然后我们还需要定义一个抽象子类CondimentDecorator继承抽象基类Beverage。当然,这一步可以不要。

package food;


public abstract class CondimentDecorator extends Beverage{
public abstract double cost();


}


最后,我们就要用Mocha类继承抽象父类CondimentDecorator,这里,因为是Mocha类装饰HouseBlend类,因此,我们需要有一个判断,并且添加Beverage属性,看其中是否已经有值进入。

package food;


public class Mocha extends CondimentDecorator{
Beverage ber;

public Mocha(Beverage beverage){
this.ber = beverage;

}

public String getDescription(){

return ber.getDescription()+"  Mocha";
}

public double cost(){

return ber.cost()+0.2;
}


}

最后一步,也就是main函数了。

package food;


public class Food {


public static void main(String[] args) {
// TODO Auto-generated method stub

Beverage ber = new HouseBlend();

ber = new Mocha(ber);
ber = new Mocha(ber);

System.out.println(ber.getDescription()+":"+ber.cost());


}


}




    


猜你喜欢

转载自blog.csdn.net/masterpieve/article/details/79818397