假设我们需要买一杯奶茶,计算总共花了多少钱,这个比较容易,一个class一个getPrice就行。那如果我要买一杯珍珠奶茶呢?再new一个?如果还有珍珠果肉奶茶?再new一个?显然不科学,所以我们需要装饰者模式
装饰者模式定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为
这次我们要来将买一个带有milk和suger的一杯drink 先定义一个接口
public interface Drink {
public double getPrice();
}
在定义一个买家(注意,继承的目的是继承类型,而不是行为,所以这里显得怪怪的)
public class Buyer implements Drink {
private Drink drink;
public Buyer(Drink drink) {
this.drink = drink;
}
@Override
public double getPrice() {
return drink.getPrice();
}
}
接下来就是各个装饰类了 给drink加糖,设定多2元
public class Suger implements Drink {
private Drink drink;
public Suger(Drink drink) {
this.drink = drink;
}
@Override
public double getPrice() {
return drink.getPrice() + 2;
}
}
给drink加奶,设定多1元
public class Milk implements Drink {
private Drink drink;
public Milk(Drink drink) {
this.drink = drink;
}
@Override
public double getPrice() {
return drink.getPrice() + 1;
}
}
测试函数
public class MyTest {
public static void main(String[] args) {
Buyer buyer = new Buyer(new Milk(new Suger(new Drink() {
@Override
public double getPrice() {
// TODO Auto-generated method stub
return 10;
}
})));
System.out.println(buyer.getPrice());
//******************显示13
}
}
网上的其他例子都是通过一个类继承Drink,然后通过继承这个类来实现Suger和Milk的,我是直接实现了drink的