前言:繼承是實現類複用的重要手段,但卻不是惟一的手段,經過類的關聯組合一樣能夠作到,並且若是使用得當比經過繼承更富有彈性。「裝飾器模式」就是經過組合來實現相似複用和包裝,這就是OO設計的另外一個原則「合成複用原則」:則是儘可能使用合成/聚合的方式,而不是使用繼承。設計模式
概念:容許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是做爲現有的類的一個包裝。ide
代碼實現: 測試
1.Component:定義一個對象接口,能夠給這些對象動態地添加職責。this
2.ConcreteComponent: 定義一個對象,能夠給這個對象添加一些職責。spa
3.Decorator: 維持一個指向 Component 對象的指針,並定義一個與 Component 接口一致的接口。設計
4.ConcreteDecorator:向組件添加職責。代理
public interface Component { void method(); } public class ConcreteComponent implements Component { @Override public void method() { System.out.println("this is old method"); } } public class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } @Override public void method() {
//方法先後裝飾 System.out.println("before method,Decorator doing "); component.method(); System.out.println("after method ,Decorator doing"); } } //測試代碼 public static void main(String[] args) { Decorator decorator = new Decorator(new ConcreteComponent()); decorator.method(); }
總結:指針
其實裝飾器模式和代理模式很像,上面的代碼就和靜態代理同樣(我的理解),只是目的不同而已,一個用於代理,一個用於裝飾,就好像武俠的打鬥現場沒人手裏都有一把劍,有人拿來殺人,有人拿來救人,不必糾結他們的區別。學會靈活使用就好了。code
優勢:能夠動態擴展一個對象的功能。component
缺點:類太多,繼承結構複雜。