模式定義
動態(tài)的將新功能附加到對象上,在對象功能擴(kuò)展方面,它比繼承更有彈性。
設(shè)計原則
多用組合,少用繼承
類應(yīng)設(shè)計的對擴(kuò)展開放,對修改關(guān)閉。
UML類圖
裝飾者模式實例
先寫一個被裝飾者食物的類
被裝飾者-食物類
/**
* 被裝飾者-食物類
*/
public class Food {
private StringfoodName;
? ?public Food() {
}
public Food(String foodName) {
this.foodName = foodName;
? ?}
public Stringmake() {
return foodName;
? ?}
}
再定義幾個裝飾者類
裝飾者-面包類
/**
* 裝飾者-面包類
*/
public class Breadextends Food {
private Foodfood;
? ?public Bread(Food food) {
this.food = food;
? ?}
public Stringmake() {
return food.make() +"+面包";
? ?}
}
裝飾者-奶油類
/**
* 裝飾者-奶油類
*/
public class Creamextends Food {
private Foodfood;
? ?public Cream(Food food) {
this.food = food;
? ?}
public Stringmake() {
return food.make() +"+奶油";
? ?}
}
裝飾者-蔬菜類
/**
* 裝飾者-蔬菜類
*/
public class Vegetableextends Food {
private Foodfood;
? ?public Vegetable(Food food) {
this.food = food;
? ?}
public Stringmake() {
return food.make() +"+蔬菜";
? ?}
}
測試裝飾者模型
public class DecoratorDemo {
public static void main(String[] args) {
Food food =new Bread(new Vegetable(new Cream(new Food("香腸"))));
? ? ? ?System.out.println(food.make());
? ?}
}
運行結(jié)果
香腸+奶油+蔬菜+面包Process finishedwithexitcode0
這就相當(dāng)于生活當(dāng)中制作三明治的過程,我們先加一根香腸,再香腸上抹上一層奶油,再加上幾片蔬菜,最后拿面包夾上。
java.io中的裝飾者模式
總結(jié)
裝飾者模型就是動態(tài)地添加更多功能的一種方式,是一種組合和委托的思想,但是會導(dǎo)致設(shè)計中出現(xiàn)許多小類,如果過度使用,會讓程序變得很復(fù)雜,難以看明白。