一、模式簡介
定義:指在不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)地給該對象增加功能,達(dá)到裝飾效果。
場景:當(dāng)終極類增加功能時不能采用繼承方式。當(dāng)對象的功能要求可以動態(tài)地添加,也可以再動態(tài)地撤銷。
- 角色結(jié)構(gòu):
- 抽象構(gòu)件(Component)角色:定義一個抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。
- 具體構(gòu)件(Concrete Component)角色:實現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。
- 抽象裝飾(Decorator)角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實例,可以通過其子類擴展具體構(gòu)件的功能。
- 具體裝飾(ConcreteDecorator)角色:實現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對象添加附加的責(zé)任。
二、模式實現(xiàn)
以按鍵手機裝飾后成為智能手機為例子
public interface Phone { -> 抽象構(gòu)件
void action();
}
public class KeyPhone implements Phone { -> 具體構(gòu)件
@Override
public void action() {
System.out.println("按鍵手機可以打電話");
}
}
public abstract class Decorator implements Phone { -> 抽象裝飾
private Phone phone;
public Decorator(Phone phone){
this.phone = phone;
}
@Override
public void action() {
this.phone.action();
this.decoration();
}
protected abstract void decoration();
}
public class SmartPhone extends Decorator { -> 具體裝飾
public SmartPhone(Phone phone) {
super(phone);
}
@Override
protected void decoration() {
System.out.println("智能手機可以玩游戲");
}
}
裝飾前后效果對比
KeyPhone keyPhone = new KeyPhone();
keyPhone.action(); -> 裝飾前的功能
SmartPhone smartPhone = new SmartPhone(keyPhone);
smartPhone.action(); -> 裝飾后的功能