JAVA設計模式之裝飾設計模式

裝飾設計模式: 就是對想要的類功能進行加強…

例如: FileWriterBufferedWriter
BufferedWriter就是用的裝飾模式對FileWriter的功能進行增強. 效率的增強.

不僅如此…裝飾設計模式還有解耦的作用

裝飾和繼承都能實現一樣的特點: 進行功能的擴展增強

但是繼承耦合性會大…並且後面很能解耦


裝飾設計模式例子:
人在以前只有飯吃…

public class Demo {
    public static void main(String[] args) {
        Person p = new Person();
        p.chifan();
    }
}

class Person {
    void chifan() {
        System.out.println("吃飯");
    }
}

運行結果:
在這裏插入圖片描述
現在生活好了…能吃的東西也變多了…

我們可以對吃飯這個功能利用裝設設計模式進行加強

public class Demo {
    public static void main(String[] args) {

        Person p = new Person();
        //p.chifan();
        NewPerson np = new NewPerson(p);

        np.chifan();


    }
}
class Person {
    void chifan() {
        System.out.println("吃飯");
    }
}
class NewPerson {
    private Person p;
    NewPerson(Person p) {
        this.p = p;
    }

    void chifan() {
        System.out.println("開胃酒");
        p.chifan();
        System.out.println("甜點");
    }
}

運行結果:
在這裏插入圖片描述


如果用繼承話…

public class Demo {
    public static void main(String[] args) {
        NewPerson p = new NewPerson();
        p.chifan();
    }
}

class Person {
    void chifan() {
        System.out.println("吃飯");
    }
}

class NewPerson extends Person{
    void chifan() {
        System.out.println("開胃酒");
        super.chifan();
        System.out.println("甜點");
    }
}

運行結果也是和剛剛用裝飾設計模式一樣的
在這裏插入圖片描述


假設我們用操作文件的例子(類什麼的都是虛構的)

Writer
    |-- TextWriter: 用於操作文本
        |--BufferTextWriter: 加入了緩衝技術的操作文本的對象
    |-- MediaWriter: 用於操作媒體
        |--BufferMediaWriter: 加入了緩衝技術的操作媒體的對象

到這裏就已經可以了. 但是這樣做好像並不理想.
我們發現只爲提高功能. 進行繼承. 導致繼承體系越來越臃腫. 不夠靈活
這一種是讓緩衝和具體的對象相結合.


我們將緩衝進行單獨的封裝, 那個對象需要緩衝就將那個對象和緩衝關聯
就想FileWriterBufferedWriter一樣

所以裝飾比繼承靈活.

特點: 裝飾類和被裝飾類都必須所屬同一個接口或者父類

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