房屋裝修涉及基礎結構(毛坯房)與裝飾組件(主臥、陽台、廚房等)的動態組合,需計算總面積、生成描述信息。這是裝飾者模式經典應用場景。
public abstract class Home {
public string Description = "空房子";
public abstract string GetDescription();
public double Area;
public abstract double GetArea();
}
public class House : Home {
public House() { Description = "MyHouse:"; }
public override string GetDescription() => Description;
public override double GetArea() => 0.0; // 毛坯面積為0或基礎面積
}
public abstract class HomeDecorator : Home {
protected Home _home;
public HomeDecorator(Home home) {
_home = home;
}
public override string GetDescription() => _home.GetDescription();
public override double GetArea() => _home.GetArea();
}
// 主臥
public class MainRoom : HomeDecorator {
private double _area;
public MainRoom(Home home, double area) : base(home) { _area = area; }
public override string GetDescription() => _home.GetDescription() + " MainRoom";
public override double GetArea() => _home.GetArea() + _area;
}
// 陽台
public class Balcony : HomeDecorator {
private double _area;
public Balcony(Home home, double area) : base(home) { _area = area; }
public override string GetDescription() => _home.GetDescription() + " Balcony";
public override double GetArea() => _home.GetArea() + _area;
}
// 廚房
public class Kitchen : HomeDecorator {
private double _area;
public Kitchen(Home home, double area) : base(home) { _area = area; }
public override string GetDescription() => _home.GetDescription() + " Kitchen";
public override double GetArea() => _home.GetArea() + _area;
}
public class Program {
public static void Main() {
// 從毛坯開始
Home myHome = new House();
// 動態添加裝修組件
myHome = new MainRoom(myHome, 20.5); // 主臥 20.5平米
myHome = new Balcony(myHome, 5.2); // 陽台 5.2平米
myHome = new Kitchen(myHome, 8.0); // 廚房 8.0平米
myHome = new MainRoom(myHome, 15.0); // 次臥 15.0平米
Console.WriteLine($"描述: {myHome.GetDescription()}");
Console.WriteLine($"總面積: {myHome.GetArea()} 平米");
}
}
描述: MyHouse: MainRoom Balcony Kitchen MainRoom 總面積: 48.7 平米
| 傳統繼承 | 裝飾者模式 |
|---|---|
| 類爆炸:HouseWithMainRoomWithBalcony... | 組件自由組合,類數量線性增長 |
| 編譯時確定功能 | 運行時動態添加/移除功能 |
| 靜態結構 | 靈活的對象組合 |
| 單一職責違反 | 每個裝飾者職責單一 |
Cost 屬性計算裝修預算IRemovable 接口支持撤銷裝修