Java設計模式 - 裝飾者模式
目錄?? 不斷學習才是王道
?? 繼續踏上學習之路,學之分享筆記
?? 總有一天我也能像各位大佬一樣
??原創作品,更多關注我CSDN: 一個有夢有戲的人
??準備將博客園、CSDN一起記錄分享自己的學習心得!!!
??分享學習心得,歡迎指正,大家一起學習成長!
- Java設計模式 - 裝飾者模式
- 簡介
- 裝飾者模式實體
- ①、抽象類
- ②、定義單體類
- ③、定義具體奶茶
- ④、定義裝飾類
- ⑤、定義具體裝飾者
- ⑥、測驗實體
- 好文推薦

簡介
裝飾者模式是一種結構型模型,是動態的給物件增加職責,對于新增功能來說要比通過子類方式更加的靈活,他允許對一個物件進行添加新的功能,但不能改變結構,
裝飾者模式實體
德德奶茶店里有許多種奶茶,奶茶還能根據自己的喜歡添加額外的料,加入奶茶有很多種,料也有很多,要求既能夠在擴展奶茶種類的時候,改動方便,不能改變結構,使用面向物件的方式計算不同種類奶茶的費用,用戶可以只買不加料,也可以買奶茶再根據自己的喜好加料,
既想實作需求,又不能讓類太繁重,又要做到高擴展,改動方便,于是就使用了裝飾者模式,簡單說一下如何使用裝飾者首先需要一個抽象類,里面除了價格等屬性,還需要有個能夠讓子類實作的抽象方法來計算費用,具體的奶茶再來繼承這個抽象類,實作其方法并設定初始值,還需要定義總體裝飾者,他是繼承了抽象類,采用組合的方式,計算總價格,其他真正地裝飾者也就是調料,他們再去繼承這個總體裝飾者,使用的使用只要實體化父類,物件為具體的奶茶型別,在加料的時候,只需要把這杯奶茶送到裝飾者上,去讓裝飾者裝飾,最后回傳還是這個父類,
具體的類圖如下

接下來一步一步撰寫代碼來實作買一杯 紅豆奶茶 + 牛奶 + 布丁
①、抽象類
定義飲料-抽象類,包含描述和費用兩個屬性,還有個抽象方法-計算價格,提供給子類去實作,
package com.lyd.demo.drink;
/**
* @Author: lyd
* @Description: 飲料-抽象類
* @Date: 2022-08-29
*/
public abstract class Drink {
private String describe; // 描述
private float price = 0.0f;
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
// 計算費用 - 抽象 - 子類實作
public abstract float cost();
}
②、定義單體類
定義奶茶類,只需要繼承飲料類,并且獲取父類的價格,
package com.lyd.demo.drink;
/**
* @Author: lyd
* @Description: 奶茶類
* @Date: 2022-08-29
*/
public class MilkTea extends Drink {
@Override
public float cost() {
return super.getPrice();
}
}
③、定義具體奶茶
紅豆奶茶和珍珠奶茶的代碼相似,這里只粘貼紅豆奶代碼,具體奶茶,要設定描述和單價,
package com.lyd.demo.drink;
/**
* @Author: lyd
* @Description: 紅豆奶茶
* @Date: 2022-08-29
*/
public class RedBeanMilkTea extends MilkTea {
public RedBeanMilkTea() {
setDescribe(" 紅豆奶茶 ");
setPrice(7.0f);
}
}
④、定義裝飾類
總體裝飾者,繼承飲料類
package com.lyd.demo.decorator;
import com.lyd.demo.drink.Drink;
/**
* @Author: lyd
* @Description: 裝飾者
* @Date: 2022-08-29
*/
public class Decorator extends Drink {
Drink drink;
public Decorator(Drink drink) { // 組合
this.drink = drink;
}
@Override
public float cost() {
// 計算價格綜合
return super.getPrice() + drink.cost();
}
@Override
public String getDescribe() {
return drink.getDescribe() + " + " + super.getDescribe() + " " + super.getPrice();
}
}
⑤、定義具體裝飾者
具體裝飾者就是要添加的料,這里只粘貼單個代碼示例,其他相似,
package com.lyd.demo.decorator;
import com.lyd.demo.drink.Drink;
/**
* @Author: lyd
* @Description: 裝飾器 - 牛奶
* @Date: 2022-08-29
*/
public class Milk extends Decorator {
public Milk(Drink drink) {
super(drink);
setDescribe(" 牛奶 ");
setPrice(3.0f);
}
}
⑥、測驗實體
買一杯 紅豆奶茶 + 牛奶 + 布丁,
通過父類實體化具體的奶茶子類,呼叫其計算總價方法;要是需要加料,只要把奶茶實體放到new調料實體中,讓裝飾者去裝飾這個類,最后回傳也是飲料類,通過層層套入裝飾的方式就實作了裝飾者模式,在此,如果是買第二杯奶茶,只需要在new一個對應奶茶的實體,如果還有額外的品種奶茶需要添加,只要繼續添加xx奶茶類,不會改變結構,或者是需要添加調料,也是如此操作,讓其多個具體的裝飾者,
package com.lyd.demo.test;
import com.lyd.demo.decorator.Milk;
import com.lyd.demo.decorator.Pudding;
import com.lyd.demo.drink.Drink;
import com.lyd.demo.drink.PearlMilkTea;
/**
* @Author: lyd
* @Description: 測驗類
* @Date: 2022-08-29
*/
public class DecorateTest {
public static void main(String[] args) {
// 買一杯 紅豆奶茶 + 牛奶 + 布丁
// 實體化為父類物件,紅豆奶茶
Drink pearlMilkTea = new PearlMilkTea();
// 先觀察紅豆奶茶的輸出
System.out.println("您購買了: " + pearlMilkTea.getDescribe());
System.out.println("您購買的費用: " + pearlMilkTea.cost());
// 添加牛奶之后
System.out.println("添加牛奶之后");
pearlMilkTea = new Milk(pearlMilkTea);
System.out.println("您購買了: " + pearlMilkTea.getDescribe());
System.out.println("您購買的費用: " + pearlMilkTea.cost());
// 再添加布丁之后
System.out.println("再添加布丁之后");
pearlMilkTea = new Pudding(pearlMilkTea);
System.out.println("您購買了: " + pearlMilkTea.getDescribe());
System.out.println("您購買的費用: " + pearlMilkTea.cost());
}
}
運行結果:

好文推薦
- 《JAVA與模式》之裝飾模式 請看 博客園 https://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html
- 設計模式--裝飾者模式(Decorator模式) 請看 騰訊云-開發社區 https://cloud.tencent.com/developer/article/1899948
??創作不易,可能有些語言不是很通暢,如有錯誤請指正,感謝觀看!記得一鍵三連哦!??
看過百遍,還不如動手一遍,動手敲敲代碼有助于理解,設計模式不是很容易就理解,需要動手嘗試,這樣不僅能夠學會設計模式,更能夠更好的理解java面向物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506159.html
標籤:其他
