- 设计原则
1、封装变化
2、多用组合,少用继承
3、针对接口编程,不针对现实编程
4、为交互对象之间的松耦设计而努力
5、对扩展开放,对修改关闭
- 装饰者模式
装饰者模式 —— 动态将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
代码实现
/**
* Component类
* 抽象类
* @author WangChunhe
*
*/
public abstract class Beverage {
String description = "Unknown Beverage" ;
public String getDescription() {
return description ;
}
/**
* 抽象方法
* @return
*/
public abstract double cost();
}
/**
* Decorator类
* 抽象类
* @author WangChunhe
*
*/
public abstract class CondimentDecoator extends Beverage {
@Override
public double cost() {
// TODO Auto-generated method stub
return 0;
}
/**
* 所有的调料装饰者都必须重新实现getDescription()方法
*/
public abstract String getDescription();
}
/**
* 具体组件
* @author WangChunhe
*
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
//description 实例变量继承自Beverage
description = "HouseBlend Coffee" ;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.89;
}
}
/**
* 具体组件
* @author WangChunhe
*
*/
public class DarkRoast extends Beverage {
public DarkRoast () {
description = "DarkRoast " ;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.99;
}
}
/**
* 具体组件
* @author WangChunhe
*
*/
public class Espresso extends Beverage {
public Espresso() {
//description实例变量继承来自Beverage
description = "Espreeso" ;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 1.99;
}
}
/**
* 具体装饰者
* @author WangChunhe
*
*/
public class Mocha extends CondimentDecoator {
Beverage beverage;
/**
*
* @param beverage 作为被装饰者
*/
public Mocha (Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage .getDescription() + ", Mocha";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.20 + beverage .cost();
}
}
/**
* 具体装饰者
* @author WangChunhe
*
*/
public class Soy extends CondimentDecoator {
Beverage beverage;
public Soy (Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage .getDescription() +" , Soy ";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.15 + beverage .cost();
}
}
/**
* 具体装饰者
* @author WangChunhe
*
*/
public class Whip extends CondimentDecoator {
Beverage beverage;
public Whip (Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage .getDescription() + ", Whip";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.10 + beverage .cost();
}
}
/**
* 测试类
* @author WangChunhe
*
*/
public class StarbuzzCoffee {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Beverage beverage = new Espresso();
System. out.println(beverage.getDescription() + " $ " + beverage.cost());
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System. out.println(beverage2.getDescription() + " $ " + beverage2.cost());
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System. out.println(beverage3.getDescription() + " $ " + beverage3.cost());
}
}
测试结果