定義
動態的給對象添加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。
角色
- Comoinent抽象構件:具體類和抽象裝飾類共同的父類,在其中聲明了具體構件實現的業務方法,是最核心的對象,也是最原始的對象
- ConcreteConponent具體構件:實現了抽象構建類或者接口的類,需要裝飾的對象。
- Decotator裝飾角色:抽象構建的子類,用于給具體構建類增加職責,具體的職責在子類中實現。維護一個抽象構建的引用,從而達到裝飾的目的
- ConcreteDecorator具體裝飾角色:抽象裝飾類的子類,負責向抽象構建添加職責,每個具體的裝飾類都定義了一些新的行為
需求
現在有三套不同面積房子需要裝修,裝修的風格有3種(中式,美式,歐式)。客戶希望提供每套房子三種裝修風格的樣例。如果不采用設計模式,采用繼承的方式來是實現,就需要提供9個類,生成類的數量比較多,也不利于維護。所以還是首選設計模式實現。
代碼實現
//抽象構件
public abstract class House {
//抽象方法,房子當前裝修的樣式
public abstract void display();
}
//具體構建,房子的主要用途是居住
public class House_First extends House {
@Override
public void display() {
System.out.println("房子是用來住的,我是樓房");
}
}
//裝飾類
public class House_Decorator extends House {
private House house;
public House_Decorator(House house) {
this.house = house;
}
@Override
public void display() {
house.display();
}
}
//裝飾類具體實現,中式風格
public class House_Decorator_China extends House_Decorator {
public House_Decorator_China(House house) {
super(house);
}
private void decorator(){
System.out.println("房子的裝修風格是中式");
}
@Override
public void display() {
decorator();
super.display();
}
}
//裝飾類具體實現美式風格
public class House_Decorator_American extends House_Decorator {
public House_Decorator_American(House house) {
super(house);
}
private void decorator(){
System.out.println("房子的裝修風格是美式");
}
@Override
public void display() {
decorator();
super.display();
}
}
//客戶端調用
public class Client {
public static void main(String[] args) {
House house = new House_First();
House house1 = new House_Decorator_China(house);
house1.display();
house = new House_Decorator_American(house);
house.display();
}
}
//運行結果
房子的裝修風格是中式
房子是用來住的,我是樓房
房子的裝修風格是美式
房子是用來住的,我是樓房
總結
通過上面的代碼,實現了房子的裝飾,增加了額外的職責,與它的核心功能實現了完全的分離。
優點
- 裝飾類和被裝飾類可以獨立的發展,不會相互耦合,
- 裝飾模式是繼承關系的一個替代方案,避免了類的職責過重和不宜維護的特點
- 裝飾類可以動態的擴展一個類的功能。
缺點
多層裝飾比較的復雜,應該應該盡量減少裝飾的層數,一個類被裝飾的層數多了,尋找它的核心功能就非常的困難。
使用場景
- 需要擴展一個類的功能
- 動態的給一個對象增加功能,功能開可以動態的撤銷
- 需要為一批兄弟類改裝或者加裝功能
少年聽雨歌樓上,紅燭昏羅帳。
壯年聽雨客舟中,江闊云低,斷雁叫西風。
感謝支持!
---起個名忒難