裝飾者模式動態地將責任附加到物件身上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
沒有應用場景這樣說是可能沒什麼感覺。
這裡我們假設我們的專案按照業務分模組,假定我們有使用者管理模組、訂單管理模組、支付管理模組,這幾個業務模組都需要日誌模組輸出日誌,安全模組進行加密,事物模組、效能統計模組。
這些通用性的非功能性需求是幾個業務模組都需要的,跨模組的。如圖
拿我們的訂單模組來說,他的**實現有可能會這樣
public class placeordercommand
}
然後我們其他模組也需要這麼做,就會發現**重複太多了。此時我們會想到抽象出來共有的,讓各種具體的業務類去實現具體的業務
public abstract class basecommond
abstract void doingbussiness();
如上doingbussiness();就是具體的業務,哪個業務去繼承,就在此作方法做具體的業務。
但此方法有個巨大的缺點:父類定義了一切,要執行那些**,以什麼順序執行等等都被固定,無法更改。
此時我們的裝飾者模式便可以派上用場了
public inte***ce command
記錄日誌裝飾器
public class loggerdecorator implements command
@override
public void excute()
}效能統計裝飾器
public class performancedecorator implements command
@override
public void excute()
}具體的業務
public class placeordercommant implements command
}
現在我們讓這個業務能夠列印日誌、效能統計
loggerdecorator loggerdecorator = new loggerdecorator(
new performancedecorator(new placeordercommand()));
loggerdecorator.excute();
這樣就可以使用任意數量的裝飾器,任意次序執行。
java設計模式之裝飾者模式
裝飾者模式 動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。類圖 barbecue類 實現 package com.decorator public abstract class barbecue public abstract double cost fish類 ...
Java設計模式之裝飾者模式
設想乙個情景,假設有一家奶茶店,店裡面只賣飲料,不賣其他的東西,且飲料的品種只有兩種分別為coffee和milk,那麼為這家店的訂單系統可以簡單的設計為兩個類,coffee類和milk類。如果有一天,店裡面賣的飲料品種增加了很多種,這個時候我們可以發現飲料種類很多,但是每一類都可以抽象出類似的屬性和...
Java設計模式之裝飾者模式
裝飾者模式在保持原有結構不變的情況下,新建類 新增功能 去包裝原有的類。1.實體抽象類 public inte ce drink 2.具體例項實現 public class coffee implements drink override public string getdescription 3...