首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

裝修設計模式C#實現:裝飾者模式構建房屋組件動態組合

     編輯:程式設計綜合問答

問題建模

房屋裝修涉及基礎結構(毛坯房)與裝飾組件(主臥、陽台、廚房等)的動態組合,需計算總面積、生成描述信息。這是裝飾者模式經典應用場景。

核心代碼實現

1. 抽象組件接口


public abstract class Home {
    public string Description = "空房子";
    public abstract string GetDescription();
    
    public double Area;
    public abstract double GetArea();
}

2. 具體組件 (基礎房屋)


public class House : Home {
    public House() { Description = "MyHouse:"; }
    public override string GetDescription() => Description;
    public override double GetArea() => 0.0; // 毛坯面積為0或基礎面積
}

3. 抽象裝飾者


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();
}

4. 具體裝飾者 (各功能區)


// 主臥
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;
}

5. 客戶端使用示例


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...組件自由組合,類數量線性增長
編譯時確定功能運行時動態添加/移除功能
靜態結構靈活的對象組合
單一職責違反每個裝飾者職責單一

擴展建議

  1. 添加 Cost 屬性計算裝修預算
  2. 實現 IRemovable 接口支持撤銷裝修
  3. 使用 Builder 模式構建複雜預設套餐 (如「精裝兩居」)
  4. 引入訪問者模式生成詳細報價單
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved