我覺得裝飾者模式是在已有功能的基礎(chǔ)之上,動(dòng)態(tài)地添加更多 功能的一種方式予权,這些新加的代碼裝飾了原有類的 核心職責(zé)或主要行為站刑。
類UML圖
1、首先我們定義一個(gè)Coffce基類
/**
* @ explain:這里Coffee相當(dāng)于我們的Component敲街,
* 是要裝飾的類
*
*/
public abstract class Coffee {
/**
*
* @return 返回價(jià)格
*/
public abstract int getPrice();
/**
* 返回名字
* @return
*/
public abstract String getName();
}
2团搞、接著 我們定義一個(gè)Decorator類繼承 我們的Coffice基類
/**
* @ explain:Decorator類繼承 我們的Coffice基類
* @ author:
* @ email:
*/
public abstract class Decorator extends Coffee{
protected Coffee mCoffee;
/**
* 通過組合的方式把Coffee對(duì)象傳遞進(jìn)來
* @param coffee
*/
public Decorator(Coffee coffee){
mCoffee=coffee;
}
}
3、接下來我們來看我們的子類是怎樣實(shí)現(xiàn)的
public class MilkDecorator extends Decorator {
/**
* 通過組合的方式把Coffee對(duì)象傳遞進(jìn)來
*
* @param coffee
*/
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public int getPrice() {
return mCoffee.getPrice()+10;
}
@Override
public String getName() {
return "addMilk";
}
}
4多艇、接下來不難想象加糖逻恐,就奶泡。就摩卡的操作,都是在原來的之上加上配料的價(jià)格
return mCoffee.getPrice()+2;
return mCoffee.getPrice()+15;
return mCoffee.getPrice()+20;
以后你想要計(jì)算加糖峻黍,就牛奶,加奶泡的咖啡的價(jià)格复隆,只需要這樣
mCoffee = new SimpleCoffee();
mCoffee = new SugarDecorator(mCoffee);
mCoffee = new MilkDecorator(mCoffee);
mCoffee = new MilkFoamDecorator(mCoffee);
int price1 = mCoffee.getPrice();
System.out.println("price1="+price1);
以后你想要計(jì)算加糖,就牛奶咖啡的價(jià)格姆涩,只需要這樣
mCoffee = new SimpleCoffee();
mCoffee = new SugarDecorator(mCoffee);
mCoffee = new MilkDecorator(mCoffee);
int price1 = mCoffee.getPrice();
System.out.println("price1="+price1);
裝飾者模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 把類中的裝飾功能從類中搬除挽拂,可以簡(jiǎn)化原來的類
- 可以把類的 核心職責(zé)和裝飾功能區(qū)分開來,結(jié)構(gòu)清晰 明了并且可以去除相關(guān)類的重復(fù)的裝飾邏輯骨饿。