他的做法是將聚合元素(枝)與單一元素(葉) 視為同一個東西 (繼承同一個物件)
這樣的好處是當新增其他的葉時並不需要修改其他的class
先示範較不好的範例
他的缺點是當有新的葉class要做新增時例如希望新增 BCounty的時候對於bnation來說需要做大量的修改才能順利加BCounty加入
正確的範例如下
先示範較不好的範例
他的缺點是當有新的葉class要做新增時例如希望新增 BCounty的時候對於bnation來說需要做大量的修改才能順利加BCounty加入
class BRoot { private string name; private List<bnation> Nations = new List<bnation>(); public BRoot(string name) { this.name = name; } public void Add(BNation b) { Nations.Add(b); } public void Display(int depth) { Console.WriteLine(new String('-', depth) + name); foreach (var Nation in Nations) { Nation.Display(depth + 3); } } } class BNation { private string name; private List<bcity> Cities = new List<bcity>(); public BNation(string name) { this.name = name; } public void Add(BCity b) { Cities.Add(b); } public void Display(int depth) { Console.WriteLine(new String('-', depth) + name); foreach (var city in Cities) { city.Display(depth + 3); } } } class BCity { private string name; public BCity(string name) { this.name = name; } public void Display(int depth) { Console.WriteLine(new String('-', depth) + " city " + name); } } class Program { static void Main(string[] args) { BRoot root = new BRoot("Root"); BNation BChina = new BNation("China"); BNation BTaiwan = new BNation("Taiwan"); BChina.Add(new BCity("Ba Jin")); BChina.Add(new BCity("Su Jou")); BTaiwan.Add(new BCity("Taipei")); BTaiwan.Add(new BCity("Tainan")); root.Add(BChina); root.Add(BTaiwan); root.Display(0); Console.WriteLine(); } }
Result:
Root
---China
------ city Ba Jin
------ city Su Jou
---Taiwan
------ city Taipei
------ city Tainan
Root
---China
------ city Ba Jin
------ city Su Jou
---Taiwan
------ city Taipei
------ city Tainan
正確的範例如下
當需要增加BCounty的時候 就如同增加BCity一樣 新增一個class就可以完成
新的修改並不會對舊有的code造成修改
新的修改並不會對舊有的code造成修改
abstract class Component { protected string name; // Constructor public Component(string name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove(Component c); public abstract void Display(int depth); } class Nation : Component { private List<component> Nations = new List<component>(); public Nation(string name) : base(name) { } public override void Add(Component c) { Nations.Add(c); } public override void Remove(Component c) { throw new NotImplementedException(); } public override void Display(int depth) { Console.WriteLine(new String('-', depth) + name); foreach (Component City in Nations) { City.Display(depth + 3); } } } class City : Component { public City(string name) : base(name) { } public override void Add(Component c) { throw new NotImplementedException(); } public override void Remove(Component c) { throw new NotImplementedException(); } public override void Display(int depth) { Console.WriteLine(new String('-', depth) + " city " + name); //throw new NotImplementedException(); } } class Program { static void Main(string[] args) { Nation Root = new Nation("Root"); Nation China = new Nation("China"); Nation Taiwan = new Nation("Taiwan"); China.Add(new City("Ba Jin")); China.Add(new City("Su Jou")); Taiwan.Add(new City("Taipei")); Taiwan.Add(new City("Tainan")); Root.Add(Taiwan); Root.Add(China); Root.Display(0); } }Result:
Root
---Taiwan
------ city Taipei
------ city Tainan
---China
------ city Ba Jin
------ city Su Jou
沒有留言:
張貼留言