java设计模式之装饰者模式
装饰者模式的出现
装饰者的初衷:有时候继承无法完全解决问题;
比如:星巴克咖啡,对这种咖啡价格计算,我们在计算咖啡价格的时候,肯定会根据顾客点的咖啡是怎样搭配的才计算出价格;
假设有四种咖啡:HouseBlend、DarkRoaat、Decaf、Espresso。
同样有四种可以搭配的选择:Milk、Mocha、Soy、Whip。
顾客A:HouseBlend+Milk+Mocha
顾客B:DarkRoaat+Whip+Milk
……
有N多种搭配;
四种咖啡有不同的价格、同样四种搭配也有不同的价格;这个单子拿给顾客的时候、顾客可以任意点一种咖啡、可以任意搭配。
要统计每种搭配的价格,我需要写N多个类!!!会不会类爆炸。
装饰者模式
动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案!
类图
星巴克咖啡类图:
代码块
Beverage类
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
*/
public abstract class Beverage {
protected String name;
public String getName() {
return name;
}
public abstract double getPrice();
}
HouseBlend被装饰者
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
* HouseBlend类,被装饰者的初始状态
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
name = "原味咖啡";
}
@Override
public double getPrice() {
return 10;
}
}
CondimentDecorator装饰者基类
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
* 配料的基类,装饰者,用来对HouseBlend类进行多层装饰
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getName();
}
具体装饰类
Mocha类
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
*/
public class Mocha extends CondimentDecorator {
private Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getName() {
return beverage.getName() + " +Mocha";
}
@Override
public double getPrice() {
return beverage.getPrice() + 1.5;
}
}
Whip类
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
*/
public class Whip extends CondimentDecorator {
private Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getName() {
return beverage.getName() + " +Whip";
}
@Override
public double getPrice() {
return beverage.getPrice() + 0.5;
}
}
测试
package beveragedecorator;
/**
* Created by Pakar on 2016/4/8.
*/
public class MainTest {
public static void main(String[] args) {
Beverage beverage = new HouseBlend();
System.out.println(beverage.getName() + " 价钱:" + beverage.getPrice());
Mocha mocha = new Mocha(beverage);
System.out.println(mocha.getName() + " 价钱:" + mocha.getPrice());
Whip whip = new Whip(beverage);
System.out.println(whip.getName() + " 价钱:" + whip.getPrice());
CondimentDecorator decorator = new Mocha(new Whip(beverage));
System.out.println(decorator.getName() + " 价钱:" + decorator.getPrice());
}
}
运行结果: