設計模式入坑篇(一.裝飾模式)
阿新 • • 發佈:2019-01-12
文章目錄
專案需求
現在你有一家咖啡店,現在你有各種咖啡與各種各樣的配料
現在要求每一種咖啡可以自由選擇多種的調料,
最終可以計算咖啡與配料的總費用
設計思路
首先我們可以從中提取出,有咖啡與調料兩個類,
我們發現這些類都有共同的屬性與方法,所以我們可以做一個他們共同的父類
現在我們要實現能新增多個調料並且調料與咖啡能互相解耦,
我們是時候該引入裝飾者模式了,
所謂裝飾者,就是使用本類去修飾另一個類
所以我們可以將被修飾的類,作為裝飾類的一個屬性
所以我們可以設計一個裝飾者的類出來
它的被裝飾類可以存放所有要被裝飾的基本類族的類
到時候我們的裝飾模式就變成類似遞迴的樣子
例如我們買了一杯拿鐵,它要加奶泡,也就是它被奶泡裝飾
如圖
現在它再往裡面放點紅茶也就是再被紅茶修飾,
設計類圖
程式碼實現
base類
public abstract class Base { protected String description;//商品描述 protected double price;//商品價格 //計算價格 public double coast() { return price; } //返回描述資訊 public String allDescription() { return description; } }
裝飾者類
public abstract class Decoration extends Base{ protected Base b; public String allDescription() { // TODO Auto-generated method stub return b.allDescription() + description; } @Override public double coast() { // TODO Auto-generated method stub return b.coast() + price; } }
咖啡類
class mock extends Base{
public mock() {
description = "this is mock ";
price = 1.00;
}
}
class natie extends Base{
public natie() {
description = "this is natie ";
price = 2.00;
}
}
調料類
class Milk extends Decoration{
public Milk(Base b) {
// TODO Auto-generated constructor stub
description = "zhuangshi milk ";
price = 0.1;
this.b = b;
}
}
class Tea extends Decoration{
public Tea(Base b) {
// TODO Auto-generated constructor stub
description = "zhuangshi tea ";
price = 0.5;
this.b = b;
}
}
測試用例
public class test {
public static void main(String[] args) {
Base b = new natie();
b = new Tea(b);
b = new Milk(b);
b = new Tea(b);
System.out.println("消費明細為: "+b.allDescription());
System.out.println("共花費: "+b.coast()+"$");
Base b2 = new mock();
b2 = new Milk(b2);
b2 = new Milk(b2);
b2 = new Tea(b2);
System.out.println("消費明細為: "+b2.allDescription());
System.out.println("共花費: "+b2.coast()+"$");
}
}
執行結果
分析
使用裝飾者模式實現了被裝飾者與裝飾者的完全解耦,被裝飾者不知道自己被誰所裝飾,所以可以任意擴充套件