1. 程式人生 > >Java設計模式---裝飾者模式(用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強)

Java設計模式---裝飾者模式(用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強)

裝飾者模式可以動態地給一個物件新增一些額外的職責。 就增加功能來說,Decorator模式相比生成子類更為靈活。

該模式的適用環境為:

(1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。

(2)處理那些可以撤消的職責。

(3)當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。

實現該模式的關鍵步驟:

(1)Component(被裝飾物件基類):定義物件的介面,可以給這些物件動態增加職責;

(2)ConcreteComponent(具體被裝飾物件):定義具體的物件,Decorator可以給它增加額外的職責;

(3)Decorator(裝飾者抽象類):維護指向Component例項的引用,定義與Component一致的介面(也就是要繼承或實現被裝飾物件基類);

(4)ConcreteDecorator(具體裝飾者):具體的裝飾物件,給內部持有的具體被裝飾物件增加具體的職責;

這樣講大家可能有些不好理解,那我們還是老規矩安靜:

入冬以後天氣越來越冷了,下班之後,做為資深吃貨,約上二三好友痛快的來場火鍋盛宴再爽不過了。說到火鍋,不得不提在成都吃過的大龍燚火鍋,各種鍋底,配菜應有盡有,但我最喜歡的還是大龍燚火鍋原味鍋底、麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨等,想想都流口水啊。

說道這大家結合裝飾者的實現步驟,應該有點感覺了吧,上文提到的鍋底,其實就是被裝飾物件的基類,配料其實就是裝飾者抽象類,大龍燚火鍋原味鍋底這些具體的鍋底也就是具體的被裝飾物件了,麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨這些裝飾鍋底用的各種配菜也就是具體的裝飾物件。說道這,大家應該都豁然開朗了吧,下面我們開始具體的程式碼實現:

第一步:定義被裝飾物件基類(可以是抽象類也可以是介面)

public interface GuoDi { public float cost();//鍋底的價格 public String name();//鍋底的名稱 }

第二步:定義具體被裝飾物件(也就是各種鍋底,這裡定義兩種)

public class YuanYang implements GuoDi { @Override public float cost() { return 48.0f; } @Override public String name() { return “鴛鴦鍋底”; } } public class DaLongYan implements GuoDi{ @Override public float cost() { return 59.0f; } @Override public String name() { return “大龍燚火鍋原味鍋底”; } }

第三步:定義裝飾者抽象類

public abstract class PeiCai implements GuoDi { private GuoDi guodi; public FoodDecorator(GuoDi guodi) { super(); this.guodi = guodi; } @Override public float cost() { return guodi.cost(); } @Override public String name() { return guodi.name(); } }

第四步:定義具體的裝飾者物件

public class MaLaNiuRou extends PeiCai { public MaLaNiuRou(GuoDi guodi) { super(guodi); } @Override public float cost() { return super.cost()+46f; } @Override public String name() { return super.name()+"+麻辣牛肉"; } } public class MaoDu extends PeiCai {

public MaoDu(GuoDi guodi) { super(guodi); } @Override public float cost() { return super.cost()+30f; } @Override public String name() { return super.name()+"+大刀毛肚"; } }

測試類:

public class Test { public static void main(String[] args) { GuoDi guodi = new DaLongYan ();//點個大龍燚火鍋原味鍋底 MaLaNiuRou y = new MaLaNiuRou(guodi);//來個麻辣牛肉 MaoDu x = new MaoDu(y);//在麻辣牛肉的基礎上再來個大刀毛肚 System.out.println(“一共點了”+x.name()+",共消費"+s.cost()); } }

輸出結果:

1 一共點了大龍燚火鍋原味鍋底+麻辣牛肉+大刀毛肚,共消費135

以上所述是給大家介紹的JAVA裝飾者模式(從現實生活角度理解程式碼原理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。