垂直和水平装饰
裝飾器模式是在不更改其接口的情況下向對象添加功能的最佳方法之一。 我經常使用可組合裝飾器,并且總是會問自己在功能列表必須可配置時如何正確設計它們。 我不確定我的答案是否正確,但是這里有一些值得深思的地方。
公寓(1960),比利·懷爾德(Billy Wilder)
假設我有一個數字列表:
interface Numbers {Iterable<Integer> iterate(); }現在,我想創建一個僅包含奇數,唯一,正數和排序數的列表。 第一種方法是垂直的 (我剛剛將其命名):
Numbers numbers = new Sorted(new Unique(new Odds(new Positive(new ArrayNumbers(new Integer[] {-1, 78, 4, -34, 98, 4,})))) );第二種方法是水平的 (同樣,我做了一個名字):
Numbers numbers = new Modified(new ArrayNumbers(new Integer[] {-1, 78, 4, -34, 98, 4,}),new Diff[] {new Positive(),new Odds(),new Unique(),new Sorted(),} );看到不同? 第一種方法“垂直”修飾ArrayNumbers ,通過可組合修飾符Positive , Odds , Unique和Sorted添加功能。
第二種方法引入了新的接口Diff ,該接口通過Positive , Odds , Unique和Sorted實例實現了迭代數字的核心功能:
interface Diff {Iterable<Integer> apply(Iterable<Integer> origin); }對于numbers用戶,這兩種方法是相同的。 區別僅在于設計。 哪個更好?何時? 似乎垂直裝飾更容易實現,并且更適合于只暴露一些方法的較小對象。
根據我的經驗,我總是傾向于從垂直裝飾開始,因為它易于實現,但是隨著裝飾器數量的增加,最終會遷移到水平裝飾。
翻譯自: https://www.javacodegeeks.com/2015/10/vertical-and-horizontal-decorating.html
總結
- 上一篇: wps表格发送工资条邮件(excel自动
- 下一篇: rabbitmq 传递文件_Rabbit