装饰模式
定义
结构
装饰模式适合用在有扩展类的行为的需求中.
例子
计算一杯咖啡的价格(总价格=咖啡类型价格+所有调料价格)
//总接口
public abstract class Beverage {
String description = "Unknown Beverage";
String getDescription(){
return description;
}
abstract double cost();
}
//装饰接口
public abstract class CondimentDecorator extends Beverage{
abstract String getDescription();
}
//coffee 实现类
public class DarkRoast extends Beverage {
public DarkRoast(){
this.description = "DarkRoast";
}
@Override
double cost() {
return 0.99;
}
}
public class Decat extends Beverage{
public Decat(){
this.description = "Decat";
}
@Override
double cost() {
return 1.05;
}
}
public class Espresso extends Beverage {
public Espresso(){
this.description = "Espresso";
}
@Override
double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage{
public HouseBlend(){
this.description = "HouseBlend";
}
@Override
double cost() {
return 0.89;
}
}
//调料实现类
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage b){
beverage = b;
}
@Override
String getDescription() {
return beverage.getDescription()+",Mocha";
}
@Override
double cost() {
return 0.20+beverage.cost();
}
}
public class Soy extends CondimentDecorator{
Beverage beverage;
public Soy(Beverage b){
beverage = b;
}
@Override
String getDescription() {
return beverage.getDescription()+",Soy";
}
@Override
double cost() {
return 0.15+beverage.cost();
}
}
public class Whip extends CondimentDecorator{
Beverage beverage;
public Whip(Beverage b){
beverage = b;
}
@Override
String getDescription() {
return beverage.getDescription()+",Whip";
}
@Override
double cost() {
return 0.10+beverage.cost();
}
}
public static void main(String[] args) {
Beverage b = new Espresso();
System.out.println(b.getDescription()+"$"+b.cost());
Beverage b2 = new DarkRoast();
b2 = new Mocha(b2);
b2 = new Mocha(b2);
b2 = new Whip(b2);
System.out.println(b2.getDescription()+"$"+b2.cost());
}