裝飾者模式官方的定義是:
動態的將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案
在我的觀點中,對裝飾者模式的定義是:
* 使用組合,在特定方法中調用特定接口的特定方法,實現一些功能,因爲使用了接口,所以可以給已經寫好的被裝飾者動態的利用組合添加一些功能(Head First中使用的是抽象類,然後使用的是繼承,對於繼承有點排斥,而且書中對於使用抽象類的原因並沒有說明,所以就使用了接口)。
被裝飾者 首先利用接口獲得類型,然後裝飾者中對象組合的方法獲得行爲。
代碼如下:
package com.decorator;
interface SubDecorator{
public void discript();
public int cost();
}
class SubDecoratorImp_1 implements SubDecorator{
public SubDecorator sd;
public SubDecoratorImp_1(SubDecorator sb){
sd = sb;
}
public void discript() {
// TODO Auto-generated method stub
System.out.println("some thing broking 2");
sd.discript();
}
public int cost() {
// TODO Auto-generated method stub
return sd.cost()+2;
}
}
class BeDecoratorImp_1 implements SubDecorator{
public int cost() {
// TODO Auto-generated method stub
return 1;
}
public void discript() {
// TODO Auto-generated method stub
System.out.println("some thing have break");
}
}
public class MineDecorator {
public static void main(String[] args) {
SubDecorator bd=new BeDecoratorImp_1();
bd = new SubDecoratorImp_1(bd);
bd.discript();
System.out.println(bd.cost());
}
}
Java源碼中使用裝飾者模式的主要有:I/O(inputStream(file,Stringbuffer等前綴的inputStream))詳細可以參看Thingk in Java部分關於JavaI/O的部分,github上關於裝飾者模式的詳解:地址
- 裝飾者模式一般與工廠模式連用,所以可以解決代碼中會產生很多小類的問題。