如果不執行組件並將所有對象視爲組合,我會失去什麼?複合模式簡化
我已經放棄了對葉節點的實現:
即
class Component : IComponent
{
/*...*/
}
現在看看我的代碼。
public interface IComponent
{
int ID { get;set; }
string Name { get;set;}
void Add(IComponent item);
void Remove(IComponent item);
List<IComponent> Items { get; }
void Show();
}
public class Composite : IComponent
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public Composite(int id, string name)
{
_id = id;
_name = name;
}
private List<IComponent> _items = new List<IComponent>();
public void Add(IComponent item)
{
_items.Add(item);
}
public void Remove(IComponent item)
{
_items.Remove(item);
}
public List<IComponent> Items
{
get
{
return new List<IComponent>(_items);
}
}
public void Show()
{
Console.WriteLine("ID=" + _id + "; Name=" + _name);
}
}
class Program
{
static void Main(string[] args)
{
IComponent root = new Composite(1, "World");
IComponent asia = new Composite(2, "Asia");
IComponent europe = new Composite(3, "Europe");
root.Add(asia);
root.Add(europe);
asia.Add(new Composite(4, "China"));
asia.Add(new Composite(5, "Japan"));
europe.Add(new Composite(6, "Germany"));
europe.Add(new Composite(7, "Russia"));
root.Show();
Program.Traverse(root.Items);
Console.ReadLine();
}
static void Traverse(List<IComponent> items)
{
foreach (IComponent c in items)
{
c.Show();
Traverse(c.Items);
}
}
}
什麼是錯的組合模式的這種做法?這種類型的設計可以面對什麼樣的問題?
您可能會考慮澄清一下,您的問題是「通過不執行組件並將所有內容視爲組合件而失去了什麼」......我最初認爲您的代碼有問題,並且意識到您的問題不是關於代碼,其中的「作品」,但爲什麼你應該添加葉:) – Mathias 2009-11-23 06:04:05
建議你在這裏研究代碼示例和內容:http://www.dofactory.com/patterns/patterncomposite.aspx看不到任何理由你應該「放棄Leaf節點的實現」。祝你好運 ! – BillW 2009-11-23 06:11:25