1. 程式人生 > >設計模式入坑篇(一.裝飾模式)

設計模式入坑篇(一.裝飾模式)

文章目錄

專案需求

現在你有一家咖啡店,現在你有各種咖啡與各種各樣的配料
現在要求每一種咖啡可以自由選擇多種的調料,
最終可以計算咖啡與配料的總費用

設計思路

首先我們可以從中提取出,有咖啡與調料兩個類,
在這裡插入圖片描述
我們發現這些類都有共同的屬性與方法,所以我們可以做一個他們共同的父類
在這裡插入圖片描述
現在我們要實現能新增多個調料並且調料與咖啡能互相解耦,
我們是時候該引入裝飾者模式了,
所謂裝飾者,就是使用本類去修飾另一個類


所以我們可以將被修飾的類,作為裝飾類的一個屬性
所以我們可以設計一個裝飾者的類出來
在這裡插入圖片描述
它的被裝飾類可以存放所有要被裝飾的基本類族的類
到時候我們的裝飾模式就變成類似遞迴的樣子
例如我們買了一杯拿鐵,它要加奶泡,也就是它被奶泡裝飾
如圖
在這裡插入圖片描述
現在它再往裡面放點紅茶也就是再被紅茶修飾,
在這裡插入圖片描述

設計類圖

在這裡插入圖片描述

程式碼實現

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()+"$");
		
	}

}

執行結果

在這裡插入圖片描述

分析

使用裝飾者模式實現了被裝飾者與裝飾者的完全解耦,被裝飾者不知道自己被誰所裝飾,所以可以任意擴充套件