裝飾者模式

裝飾模式:類似代理

定義:動態給一個對象添加一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更爲靈活。

設計初衷:通常可以使用繼承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的。

定義超類:

public interface Source {
    void say();
    void sing();
}
具體實現(被裝飾者):
public class SourceImpl implements Source {
    public void say() {
        System.out.println("hello");
    }

    public void sing() {
        System.out.println("sing a song");
    }
}

抽象裝飾:裝飾者與被裝飾者擁有共同的超類,繼承的目的是繼承類型,而不是行爲
public abstract class Decorator implements Source{

    private Source source;

    public Decorator(Source source) {
        this.source = source;
    }

    public void say() {
        this.source.say();
    }

    public void sing() {
        this.source.sing();
    }
}

裝飾者1
public class D1 extends Decorator {
    public D1(Source source) {
        super(source);
    }

    @Override
    public void say() {
        super.say();
        System.out.println("chen");
    }

    @Override
    public void sing() {
        super.sing();
        System.out.println("吻別");
    }
}
裝飾者2
public class D2 extends Decorator {
    public D2(Source source) {
        super(source);
    }

    @Override
    public void say() {
        log("start say:");
        super.say();
    }

    @Override
    public void sing() {
        log("start sing:");
        super.sing();
    }

    public void log(String  log){
        System.out.println(log);
    }
}

測試:
public class Client {
    public static void main(String[] args) {
        Source source = new SourceImpl();
        Decorator decorator = new D2(new D1(source));
        decorator.say();
        decorator.sing();
    }
}
結果:
start say:
hello
chen
start sing:
sing a song
吻別


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章