概述
類圖
需要注意的東西
- 上述中Components和Decorator均可以是接口也可以是抽象類。
- 裝飾者和被裝飾者需要實現相同的接口或者抽象類。即裝飾者和被裝飾者對象擁有相同的超類。
- 可以用一個或多個裝飾者包裝一個對象。
- 裝飾者模式的用意是包喫接口並增加對象的職責。
- 一張圖看懂裝飾者模式流程。
應用場景
代碼實現
這裏爲了簡化代碼,只採用兩種咖啡HouseBlend、Espresso,兩種配料Mocha、Mocha,這樣的搭配。
package decorator;
/**
* <p>ClassName Beverage
* <p>Description 超類
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 0:51
*/
public abstract class Beverage {
String description = "unknow Beverage";
public String getDescription() {
return description;
}
/**
* 計算花費
*
* @return
*/
public abstract Double cost();
}
package decorator;
/**
* <p>ClassName CondimentDecorator
* <p>Description 配料抽象類
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 0:55
*/
public abstract class CondimentDecorator extends Beverage {
/**
* 所有的配料裝飾者都需要重寫getDescription
*/
public abstract String getDescription();
}
package decorator;
/**
* <p>ClassName Espresso
* <p>Description 一種飲品(具體的組件)
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 1:01
*/
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public Double cost() {
return 1.99;
}
}
package decorator;
/**
* <p>ClassName HouseBlend
* <p>Description 另外一種飲品(具體的組件)
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 1:04
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "HouseBlend";
}
public Double cost() {
return 0.89;
}
}
package decorator;
/**
* <p>ClassName Mocha
* <p>Description 具體裝飾者
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 1:05
*/
public class Mocha extends CondimentDecorator {
Beverage beverage; //被裝飾者
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Mocha";
}
public Double cost() {
return 0.2 + beverage.cost();
}
}
package decorator;
/**
* <p>ClassName Whip
* <p>Description 具體裝飾者
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 1:12
*/
public class Whip extends CondimentDecorator {
Beverage beverage; //被裝飾者
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Whip";
}
public Double cost() {
return 66.66 + beverage.cost();
}
}
package decorator;
/**
* <p>ClassName TestDecorator
* <p>Description 測試類
* <p>Author ChongLou
* <p>Version
* <p>Date 2017/7/24 1:09
*/
public class TestDecorator {
public static void main(String[] args) {
/**
* 一杯Espresso,不加配料
*/
Beverage beverage = new Espresso();
System.out.println( beverage.getDescription() + " $" + beverage.cost() );
/**
* 一杯Houseblend,加Mocha,Whip
*/
Beverage beverage1 = new HouseBlend();
beverage1 = new Mocha( beverage1 );
beverage1 = new Whip( beverage1 );
System.out.println( beverage1.getDescription() + " $" + beverage1.cost() );
}
}