設計模式 裝飾者模式

2021-07-12 03:20:41 字數 2070 閱讀 3383

定義:

裝飾者模式動態給乙個物件新增額外的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

裝飾者模式的特點:

1)裝飾者和被裝飾物件有相同的超型別。

2)你可以用乙個或多個裝飾者包裝乙個物件。

3)既然裝飾者和被裝飾物件有相同的超型別,所以在任何需要原始物件(被包裝的)的場合,可以用裝飾過的物件代替它。

4)裝飾者可以在所委託被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的。

物件可以在任何時候被裝飾,所以可以       在執行時動態地、不限量地用你喜歡的裝飾者來裝飾物件。

類圖:

在現實生活中我們經常會遇到諸如裝飾者的例子。比如,我們去餐館吃公尺粉(ricenoodle),公尺粉有粗粉(coarsericenoodle)、

細粉(fine

ricenoodle

)等分類。公尺粉的製作過程中又可以新增許多配料(

condiment

)以滿足客戶的口味,配料有牛肉(

beefcondiment

)、豬肉(

porkcondiment

)等作料。不同種類的公尺粉加上不同的配料做出來的公尺粉**也不一樣,如果用具體的子類繼承公尺粉了並考慮到所有組合的話,類的數量是無上限的。而且當配料的**改變的話,

就必須更改含有此配料的子類,這樣

就不符合

類應該對擴充套件開放,對修改

關閉。

公尺粉(介面/抽象類):

public abstract class ricenoodle

public abstract double price();

}

粗粉:

public class coarsericenoodle extends ricenoodle

@override

public double price()

}

細粉:

public class finericenoodle extends ricenoodle

@override

public double price()

}

配料(必須實現/繼承 公尺粉 介面/抽象類):

public abstract class condimentdecorator extends ricenoodle

牛肉配料:

public class beefcondimentdecorator extends condimentdecorator

@override

public string getdescription()

@override

public double price()

}

豬肉配料:

public class porkcondimentdecorator extends condimentdecorator

@override

public string getdescription()

@override

public double price()

}

客戶端**:

public class client

}輸出: 粗粉**:7.0元

豬肉牛肉細粉**:16.0元

應用場景:1.當我們需要為某個現有的物件,動態的增加乙個新的功能或職責時,可以考慮使用裝飾模式。

2.當某個物件的職責經常發生變化或者經常需要動態的增加職責,避免為了適應這樣的變化,而增加繼承子類擴充套件的方式,因為這種方式會造成子類膨脹的速度過快,難以控制。

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...

設計模式 裝飾者模式

好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...