裝飾模式就是給一個對象增加一些新的功能,而且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例
1、代碼演示
Source類是被裝飾類,Decorator類是一個裝飾類,可以爲Source類動態的添加一些功能
a.被裝飾類的接口:
public interface Sourceable {
public void method();
}
b.被裝飾類Source:
public class Source implements Sourceable {
@Override
public void method() {
System.out.println("the original method!");
}
}
c.裝飾類Decorator:
public class Decorator implements Sourceable {
private Sourceable source;
public Decorator(Sourceable source){
this.source = source;
}
//給之前的對象增加新的功能
@Override
public void method() {
System.out.println("before decorator!");
source.method();
System.out.println("after decorator!");
}
}
d.測試類:
public class DecoratorTest {
public static void main(String[] args) {
Sourceable source = new Source();
Sourceable obj = new Decorator(source);
obj.method();
}
}
輸出:
before decorator!
the original method!
after decorator!
2、裝飾器模式的應用場景:
1、需要擴展一個類的功能。
2、動態的爲一個對象增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)
缺點:產生過多相似的對象,不易排錯!