今天我来向大家讲解一下装饰者模式,装饰者模式的设计原则同样也是对扩展开放,对修改关闭,那我们就有了一个问题,如何做到对修改关闭,对扩展开放呢?
我们都知道,装饰者模式的定义是动态地将责任附加到对象中,其实装饰者模式也可以说是动态嵌套的一个过程。就比如举例来说,假如我现在到一个商店中买了一杯牛奶咖啡,这里我们用到的装饰者模式的地方就是,我的牛奶装饰了咖啡,也可以说咖啡装饰了牛奶,因为装饰者模式是可以相互嵌套的。当然,当我的牛奶装饰咖啡的时候,我需要有一个判断,因为我要付钱给老板,我的牛奶和咖啡是分开算钱的,那我就需要一个抽象父类来使得我的牛奶类和咖啡类来继承,其中贯穿整个代码的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());
}
}