定義: 裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 結構:(書中圖,侵刪) 一個被裝飾介面類:從具體類中抽象出來,擁有用於修飾的一個公共方法 若幹被裝飾具體類;繼承於被裝飾介面類 一個抽象裝飾類:繼承於被裝飾介面類 ...
定義:
裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。結構:(書中圖,侵刪)
![](https://img2018.cnblogs.com/blog/1532854/201901/1532854-20190128151702619-1274470459.png)
例子:
模擬寵物去做造型 美容院提供:洗澡、染色、修剪、穿衣服等服務。 被裝飾介面類:寵物類package designpattern.decorator; public abstract class Pet { String name; Pet() {// 因為子類要使用其他參數的構造函數,需要調用父類的預設(無參)構造方法 } Pet(String name) { this.name = name; } Pet(String name, int test) { this.name = name; } public abstract void beautify(); }
若幹被裝飾具體類:貓、狗
package designpattern.decorator; public class Cat extends Pet { public Cat(String name) { this.name = name; } @Override public void beautify() { System.out.println(name + ":貓正在打扮~"); } }
package designpattern.decorator; public class Dog extends Pet { public Dog(String name) { this.name = name; } @Override public void beautify() { System.out.println(name + ":狗正在打扮~"); } }
抽象裝飾類:美容類
package designpattern.decorator; public class Beautify extends Pet { Pet pet; Beautify(Pet pet) { this.pet = pet; } @Override public void beautify() { System.out.println("裝飾父類beautify()"); pet.beautify(); } }若幹具體裝飾類:洗澡、染色、修剪、穿衣服
package designpattern.decorator; public class Shower extends Beautify{ Shower(Pet pet) { super(pet); } @Override public void beautify() { super.beautify(); System.out.println("洗澡"); } }
package designpattern.decorator; public class Dye extends Beautify { Dye(Pet pet) { super(pet); } @Override public void beautify() { super.beautify(); System.out.println("染色"); } }
package designpattern.decorator; public class Trim extends Beautify { Trim(Pet pet) { super(pet); } @Override public void beautify() { super.beautify(); System.out.println("修剪"); } }
package designpattern.decorator; public class Dress extends Beautify { Dress(Pet pet) { super(pet); } @Override public void beautify() { super.beautify(); System.out.println("穿衣服"); } }
客戶端調用:
package designpattern.decorator; public class Client { public static void main(String[] args) { Cat cat = new Cat("小喵"); // 直接調用 cat.beautify(); System.out.println("----------------"); // 裝飾後調用 Shower showerCat = new Shower(cat); Dye dyeCat = new Dye(showerCat); Trim trimCat = new Trim(dyeCat); trimCat.beautify();
System.out.println("==================");
Dog dog = new Dog("小汪"); // 直接調用 dog.beautify(); System.out.println("----------------"); // 裝飾後調用 Shower showerDog = new Shower(dog); Dress dressDog = new Dress(showerDog); dressDog.beautify(); } }
結果:
小喵:貓正在打扮~ ---------------- 裝飾父類beautify() 裝飾父類beautify() 裝飾父類beautify() 小喵:貓正在打扮~ 洗澡 染色 修剪 ================== 小汪:狗正在打扮~ ---------------- 裝飾父類beautify() 裝飾父類beautify() 小汪:狗正在打扮~ 洗澡 穿衣服從輸出能看出,有幾層裝飾,就會調用幾次裝飾父類的beautify()方法。 以上例的狗小汪為例:
通過最底層的穿衣服Dress的方法:
![](https://img2018.cnblogs.com/blog/1532854/201901/1532854-20190128152622636-299327425.png)