简单的可以理解为给爱用继承人的一种新的设计方式
星巴克咖啡
因为星巴克咖啡的扩张速度太快了,所以要更新他们的订单系统,以合乎他们的订单需求
他们原来的类是这样设计的.
因为在在购买的时候还需要加入一些调料,例如,蒸奶,豆浆,摩卡,所以订单系统也会来考虑到调料部分
下面是一开始他们的所有类设计图
这简直就是类爆炸啊!!!!
违反了我们的设计原则:
多用组合少用继承,以及没有实现松耦合
这个设计不好的地方在哪?
调料的价格更改需要我们更改代码
一旦出现新的调料我们就需要加入新的方法,并改变cost方法
万一顾客想要双倍的摩卡怎么办?
此刻有引入了一个新的设计原则:
类应该对扩展开放,对修改关闭.
需要注意的是:不是所有的地方都需要使用装饰者模式浪费时间,只在经常需要改变的地方
我们使用装饰的做法就是:
我们以饮料为主体,然后再运行时调用调料来装饰饮料
1.拿一个初始咖啡对象
2.以摩卡对象来装饰它
3.以奶泡对象来装饰他
4.调用超类的cost方法来委托运算,计算价格
装饰者就是在被装饰者的行为前或行为后加上特定的行为,来达到特定的目的.
装饰者模式定义:动态的将行为附加到对象上,扩展功能比继承更方便
java代码实现
/**
* @author wang
* 饮料基类
*/
public abstract class Beverage {
String description = "unkonw Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
/**
* @author wang
* 调料基类
*/
public abstract class Condiment extends Beverage{
public abstract String getDescription();
}
public class DarkRoast extends Beverage{
public DarkRoast(){
description = "DarkRoast";
}
@Override
public double cost() {
return 10.0;
}
}
public class Decaf extends Beverage{
public Decaf(){
description = "Decaf";
}
@Override
public double cost() {
return 6.0;
}
}
public class HouseBlend extends Beverage{
public HouseBlend(){
description = "HouseBlend";
}
@Override
public double cost() {
return 12.0;
}
}
public class milk extends Condiment{
Beverage beverage;
public milk(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",milk";
}
@Override
public double cost() {
return 5.0+beverage.cost();
}
}
public class Mocha extends Condiment{
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",Mocha";
}
@Override
public double cost() {
return 2.0+beverage.cost();
}
}
public class Soy extends Condiment{
Beverage beverage;
public Soy(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",soy";
}
@Override
public double cost() {
return 0.5+beverage.cost();
}
}
public class test {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+"$"+beverage.cost());
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new whlp(beverage2);
System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
}
}
public class whlp extends Condiment{
Beverage beverage;
public whlp(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",whlp";
}
@Override
public double cost() {
return 3.0+beverage.cost();
}
}
java内部应用装饰者模式最多的是javaIO