定義
裝飾者模式又名包裝(Wrapper)模式击纬。裝飾者模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能虐呻,是繼承關(guān)系的一個(gè)替代方案绊困。
裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象身上。若要擴(kuò)展功能抡诞,裝飾者提供了比繼承更有彈性的替代方案。
如何使用
還記得在大學(xué)時(shí)候玩過(guò)一個(gè)游戲叫《海盜王》土陪,玩家可以在自己的武器等裝備上鑲嵌各種寶石來(lái)增加屬性昼汗,如增加攻擊力,增加防御鬼雀,血量等等顷窒,這就是一個(gè)典型的可以應(yīng)用裝飾者的場(chǎng)景。
首先應(yīng)該有個(gè)裝備的接口
public interface Equipment {
/**
* 攻擊力
* @return
*/
int attack();
/**
* 防御力
* @return
*/
int defense();
/**
* 生命值
* @return
*/
int lifeValue();
}
然后我擁有一把大寶劍,它擁有超凡的攻擊力1000鞋吉,佩戴時(shí)增加生命值200
public class Sword implements Equipment {
@Override
public int attack() {
return 1000;
}
@Override
public int defense() {
return 0;
}
@Override
public int lifeValue() {
return 200;
}
}
向裝備上鑲嵌的寶石鸦做,分別為紅色寶石(增加攻擊力50/顆),藍(lán)色寶石(增加防御力50/顆)谓着,綠色寶石(增加生命值100/顆)
紅色寶石
public class RedGem implements Equipment {
private Equipment equipment;
public RedGem(Equipment equipment) {
this.equipment = equipment;
}
@Override
public int attack() {
return this.equipment.attack() + 50;
}
@Override
public int defense() {
return this.equipment.defense();
}
@Override
public int lifeValue() {
return this.equipment.lifeValue();
}
}
藍(lán)色寶石
public class BlueGem implements Equipment {
private Equipment equipment;
public BlueGem(Equipment equipment) {
this.equipment = equipment;
}
@Override
public int attack() {
return this.equipment.attack();
}
@Override
public int defense() {
return this.equipment.defense() + 50;
}
@Override
public int lifeValue() {
return this.equipment.lifeValue();
}
}
綠色寶石
public class GreenGem implements Equipment {
private Equipment equipment;
public GreenGem(Equipment equipment) {
this.equipment = equipment;
}
@Override
public int attack() {
return this.equipment.attack();
}
@Override
public int defense() {
return this.equipment.defense();
}
@Override
public int lifeValue() {
return this.equipment.lifeValue() + 100;
}
}
現(xiàn)在我想知道在大寶劍上鑲嵌了2顆紅寶石1顆藍(lán)寶石2顆綠寶石后泼诱,我能得到什么樣的屬性呢?
Equipment equipment = new RedGem(new RedGem(new BlueGem(new GreenGem(new GreenGem(new Sword)))));
equipment.attack(); //攻擊力總計(jì)
equipment.defense(); //防御力總計(jì)
equipment.lifeValue(); //生命值總計(jì)
總結(jié)
至此我們完成了裝飾者模式的例子赊锚,可能有人會(huì)問(wèn)這樣做看起來(lái)code也不是很簡(jiǎn)單鴨治筒,但是想想“開(kāi)閉原則”,如果這時(shí)候又來(lái)個(gè)裝備比如鞋子舷蒲,或者又新增了一種黑色的寶石耸袜,是不是只需要進(jìn)行簡(jiǎn)單的擴(kuò)展即可,所以這才是使用裝飾者模式的目的牲平!