裝飾者模式
裝飾UML.png
interface Liquid{
void drink();
}
定義一個液體接口,能喝的哦
class Water implements Liquid{
public void drink(){
// 我們不生產水,我們只是大自然的搬運工
}
}
純凈水
class LiquidDecortor implements Liquid{
private Liquid liquid;//被裝飾的主體
public LiquidDecortor(Liquid liquid){
this.liquid = liquid;
}
public void drink(){
liquid.drink();//實際調用的是主體的喝方法
}
}
抽象裝飾類
class Coffee extends LiquidDecortor{
public Coffee(Liquid liquid){
super(liquid);
}
public void drink(){
super.drink();
other taste//咖啡啥子味道自行腦補,就是添加了新的味道,擴充了液體只能喝的功能。雖然還是喝但是喝出來coffee的味道
}
public void otherMethods(){
//半透明裝飾模式,不僅僅是增強了原本接口規范的功能,還新增了另外功能,比如咖啡能壯陽(別聽我瞎比比)
}
}
咖啡類,擴展了喝的功能,添加了點味道
class Milk extends LiquidDecortor{
public Milk(Liquid liquid){
super(liquid);
}
public void drink(){
super.drink();
other taste//牛奶會有奶香味
}
public void otherMethods(){
//半透明裝飾模式,不僅僅是增強了原本接口規范的功能,還新增了另外功能,比如牛奶幫助睡眠
}
}
牛奶類,擴展了喝的功能,添加了點奶味
class Client{
public static void main(String[] args){
Liquid liquid,milk;
liquid = new Water();
milk = new Milk(liquid);
milk.drink();//喝牛奶 透明裝飾者模式
///////////////////////華麗分割線
Milk superMilk = new Milk(liquid);
superMilk.drink();//還是喝牛奶
superMilk.otherMethods();//其他功能,促睡眠,長個子,呵呵呵等
}
}
客戶端
個人總結
裝飾者模式是為了增強功能以及擴展新功能,這和java的繼承功能重合。相比之下,裝飾者模式更加靈活。對于一個需要被擴展功能的對象來說(被裝飾類)可以動態的去選擇適合自己想要的裝飾類來完成功能的加強或者添加新功能。