實作 MessageModelComponent,代表樹狀結構中的葉子節點,持有實際資料 MessageModel:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Composite
{
///
/// Message 實體樹葉(Leaf)
///
public class MessageModelLeaf : MessageModelComponent
{
///
/// 建構函式
///
/// 名稱
/// Message 實體物件
public MessageModelLeaf(string name, MessageModel mm)
: base(name, mm)
{
}
///
/// 添加操作:葉子節點不支援,拋出異常
///
/// MessageModelComponent
public override void Add(MessageModelComponent mmc)
{
throw new Exception("不能添加");
}
///
/// 移除操作:葉子節點不支援,拋出異常
///
/// MessageModelComponent
public override void Remove(MessageModelComponent mmc)
{
throw new Exception("不能刪除");
}
///
/// 獲取資料:返回格式化的葉子資訊
///
/// 縮進數
/// 格式化字串
public override string GetData(int indent)
{
return new String('—', indent) +
"樹葉名稱:" + _name +
";信息內容:" + _messageModel.Message +
"<br />";
}
}
}
MessageModel,作為葉子節點的業務資料載體。Add()/Remove() 拋出異常,明確語意:葉子不可包含子節點。GetData() 格式化輸出葉子資訊,包含縮進視覺化。| 策略 | 透明性 (本例) | 安全性 |
|---|---|---|
| 介面定義 | Component 宣告 Add/Remove | 只有 Composite 宣告 Add/Remove |
| 客戶端調用 | 統一介面,無需判斷型別 | 需判斷是否為 Composite 才能調用 |
| 葉子實作 | 拋出異常或空實作 | 不實作 Add/Remove |
| 優點 | 客戶端簡單,對 Leaf/Composite 一視同仁 | 編譯期檢查,避免運行時異常 |
| 缺點 | 運行時可能拋出異常 | 客戶端代碼較複雜 |
本例採用透明性設計,符合組合模式「使客戶對單個物件和組合物件的使用具有一致性」的核心意圖。