設計模式 裝飾器模式

2021-09-12 23:06:05 字數 2254 閱讀 5622

裝飾者模式的應用場景

裝飾者模式(decorator pattern)是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案(擴充套件原有物件的功能),屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋;給蛋糕加上一些水果;給房子裝修等,為物件擴充套件一些額外的職責。裝飾者在**程式中適用於以下場景:

1、用於擴充套件乙個類的功能或給乙個類新增附加職責。

2、動態的給乙個物件新增功能,這些功能可以再動態的撤銷

我記得有做蛋糕的小遊戲,先會有乙個麵餅,然後可以加奶油、巧克力、水果等,我們以此舉例:

蛋糕建立者介面

public inte***ce creator
蛋糕生產者cakecreator

public class cakecreator implements creator 

}

專門加奶油的生產者

public class creamaddcreator  implements creator 

@override

public string createcake()

}

專門加水果的生產者

public class fruitaddcreator implements creator 

@override

public string createcake()

}

測試類:

public class decoratortest 

}

執行結果:

這個例子中我們通過組合不同的裝飾者就可以實現各種樣式蛋糕的製作。而不用變更最初cakecreator 中的邏輯。這個過程和動態**有點類似,不同的是更加靈活。如果用靜態**完成加水果和忌廉的蛋糕,很容易實現。但是如果邏輯變為 先加忌廉再加水果,甚至加3分水果兩份奶油,那靜態**實現起來就比較複雜了。而我們的裝飾者模式可以隨意組合實現。

裝飾者模式和介面卡模式對比裝飾者模式在原始碼中的應用

裝飾器模式在原始碼中也應用得非常多,在jdk 中體現最明顯的類就是io 相關的類,如bufferedreader、inputstream、outputstream,看一下常用的inputstream 的類結

在spring 中的transactionawarecachedecorator 類我們也可以來嘗試理解一下,這個類主要是用來處理事務快取的

public class transactionawarecachedecorator implements cache 

public cache gettargetcache()

...}

transactionawarecachedecorator 就是對cache 的乙個包裝。再來看乙個mvc 中的裝飾者模式httpheadresponsedecorator 類

最後,看看mybatis 中的一段處理快取的設計org.apache.ibatis.cache.cache 類,

從名字上來看其實更容易理解了。比如fifocache 先入先出演算法的快取;lrucache 最近最少使用的快取;transactionlcache 事務相關的快取,都是採用裝飾者模式

裝飾者模式的優缺點

優點:1、裝飾者是繼承的有力補充,比繼承靈活,不改變原有物件的情況下動態地給乙個物件擴充套件功能,即插即用。

2、通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果。

3、裝飾者完全遵守開閉原則。

缺點:1、會出現更多的**,更多的類,增加程式複雜性。

2、動態裝飾時,多層裝飾時會更複雜。

設計模式 裝飾器模式

裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。public inte ce playe...

設計模式 裝飾器模式

定義 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類。角色 實現 public abstract class house public abstract void sleep public class ...

設計模式 裝飾器模式

在玩lol的時候,我們會對喜歡的英雄購買相應的 每種 都有不同的效果。裝飾器模式是指在不改變現有物件結構的情況下,可以動態的對當前物件增加新的職責,它屬於物件結構型模式。裝飾器模式通過拓展的方式來修改物件,比繼承更靈活 對同乙個物件可以新增多個裝飾類,可以進行多種組合。抽象構件介面 public i...