模式定義 動態的將新功能附加到對象上,在對象功能擴展方面,它比繼承更有彈性。 設計原則 多用組合,少用繼承 類應設計的對擴展開放,對修改關閉。 ...
模式定義
動態的將新功能附加到對象上,在對象功能擴展方面,它比繼承更有彈性。
設計原則
- 多用組合,少用繼承
- 類應設計的對擴展開放,對修改關閉。
UML類圖
裝飾者模式實例
先寫一個被裝飾者食物的類
被裝飾者-食物類
package com.wpx.decorator;
/**
* 被裝飾者-食物類
*/
public class Food {
private String foodName;
public Food() {
}
public Food(String foodName) {
this.foodName = foodName;
}
public String make() {
return foodName;
}
}
再定義幾個裝飾者類
裝飾者-麵包類
package com.wpx.decorator;
/**
* 裝飾者-麵包類
*/
public class Bread extends Food {
private Food food;
public Bread(Food food){
this.food=food;
}
public String make(){
return food.make()+"+麵包";
}
}
裝飾者-奶油類
package com.wpx.decorator;
/**
* 裝飾者-奶油類
*/
public class Cream extends Food {
private Food food;
public Cream(Food food) {
this.food = food;
}
public String make() {
return food.make() + "+奶油";
}
}
裝飾者-蔬菜類
package com.wpx.decorator;
/**
* 裝飾者-蔬菜類
*/
public class Vegetable extends Food {
private Food food;
public Vegetable(Food food) {
this.food = food;
}
public String make() {
return food.make() + "+蔬菜";
}
}
測試裝飾者模型
package com.wpx.decorator;
public class DecoratorDemo {
public static void main(String[] args) {
Food food = new Bread(new Vegetable(new Cream(new Food("香腸"))));
System.out.println(food.make());
}
}
運行結果
香腸+奶油+蔬菜+麵包
Process finished with exit code 0
這就相當於生活當中製作三明治的過程,我們先加一根香腸,再香腸上抹上一層奶油,再加上幾片蔬菜,最後拿麵包夾上。
java.io中的裝飾者模式
總結
裝飾者模型就是動態地添加更多功能的一種方式,是一種組合和委托的思想,但是會導致設計中出現許多小類,如果過度使用,會讓程式變得很複雜,難以看明白。