close

image

Building父類別

   1: class Building
   2:   {
   3:       public Building() { }
   4:       private string name;
   5:       public Building(string name) { this.name = name; }
   6:  
   7:       public virtual void Show()
   8:       {
   9:           Console.WriteLine(" {0} 附贈家具", name);
  10:       }
  11:       protected Building component;
  12:       public void Decortate(Building component)
  13:       {
  14:           this.component = component;
  15:       }
  16:   }

Furniture類別繼承Building

   1: class Furniture : Building
   2:    {
   3:        //protected Building component;
   4:        //public void Decortate(Building component)
   5:        //{
   6:        //    this.component = component;
   7:        //}
   8:        public override void Show()
   9:        {
  10:            if(component!=null)
  11:            {
  12:                component.Show();
  13:            }
  14:        }
  15:    }

 

各類家具分別繼承Furniture

   1: class Sofa:Furniture
   2:    {
   3:        public override void Show()
   4:        {
   5:            Console.Write("+沙發 ");
   6:            base.Show();
   7:        }
   8:    }
   9:    class HighClassSofa : Furniture
  10:    {
  11:        public override void Show()
  12:        {
  13:            Console.Write("+高級沙發");
  14:            base.Show();
  15:        }
  16:    }
  17:    class BulbLight: Furniture
  18:    {
  19:        public override void Show()
  20:        {
  21:            Console.Write("+電燈泡 ");
  22:            base.Show();
  23:        }
  24:    }
  25:    class CrystalLight: Furniture
  26:    {
  27:        public override void Show()
  28:        {
  29:            Console.Write("+水晶燈 ");
  30:            base.Show();
  31:        }
  32:    }
  33:    class WoodenChair : Furniture
  34:    {
  35:        public override void Show()
  36:        {
  37:            Console.Write("+木製椅 ");
  38:            base.Show();
  39:        }
  40:    }
  41:    class BossChair : Furniture
  42:    {
  43:        public override void Show()
  44:        {
  45:            Console.Write("+董事長椅 ");
  46:            base.Show();
  47:        }
  48:    } 
  49:  
  50:    class Kitchenware : Furniture
  51:    {
  52:        public override void Show()
  53:        {
  54:            Console.Write("+廚具 ");
  55:            base.Show();
  56:        }
  57:    }
  58:    class SystemKitchenware: Furniture
  59:    {
  60:        public override void Show()
  61:        {
  62:            Console.Write("+系統廚具 ");
  63:            base.Show();
  64:        }
  65:    }
  66:    class SpringBed : Furniture
  67:    {
  68:        public override void Show()
  69:        {
  70:            Console.Write("+彈簧床 ");
  71:            base.Show();
  72:        }
  73:    }

----------------------------------------------------------------------------------------------------

客戶端測試1

1. Line 6: 高級沙發 裝飾 帝寶   =>  sofa1.Decorate(bd1)

2. Line7: 水晶燈 裝飾 高級沙發(帝寶) => light1.Decorate(sofa1)

3. Line8: 董事長椅 裝飾 水晶燈(高級沙發、帝寶)  => chair1.Decorate(light1)

4. Line9: 系統廚具 裝飾 董事長椅(水晶燈、高級沙發、帝寶) => kitchenware1.Decorate(chair1)

如果以Boxing示意,外層包裝內層, 發動順序由最外面開始Unboxing。

image

如果以Block Diagram來看,包裝順序是從索引N-1開始包裝索引N,包裝完成後由最後一個(最外層)裝飾者(kitchenware1)發動

image

5. Line10: 列印結果如下

kitchware1.Show() => chair1.Show() => light1.Show() => sofa1.Show() => bd1.Show()

image

   1: Building bd1 = new Building("帝寶");        // 建築
   2:          HighClassSofa sofa1 = new HighClassSofa();  // 高級沙發 
   3:          CrystalLight light1 = new CrystalLight();   // 水晶燈
   4:          BossChair chair1 = new BossChair();         // 董事長椅
   5:          SystemKitchenware kitchenware1 = new SystemKitchenware();  // 系統廚具
   6:          sofa1.Decortate(bd1);
   7:          light1.Decortate(sofa1);
   8:          chair1.Decortate(light1);
   9:          kitchenware1.Decortate(chair1);
  10:          kitchenware1.Show();

客戶端測試2

1. Line 6: 沙發 裝飾 民宅  =>  sofa2.Decorate(bd2)

2. Line7: 電燈泡 裝飾 沙發(民宅)  => light2.Decorate(sofa2)

3. Line8: 木製椅 裝飾 電燈泡(沙發、民宅)  => chair2.Decorate(light2)

4. Line9: 廚具 裝飾 木製椅(電燈泡、沙發、民宅)  => kitchenware1.Decorate(chair1)

5. Line10: 列印結果如下

kitchware2.Show() => chair2.Show() => light2.Show() => sofa2.Show() => bd2.Show()

image

   1: Building bd2 = new Building("民宅");       // 建築
   2:           Sofa sofa2 = new Sofa();                   // 沙發
   3:           BulbLight light2 = new BulbLight();        // 電燈泡
   4:           WoodenChair chair2 = new WoodenChair();    // 木製椅
   5:           Kitchenware kitchenware2 = new Kitchenware(); // 廚具
   6:           sofa2.Decortate(bd2);
   7:           light2.Decortate(sofa2);
   8:           chair2.Decortate(light2);
   9:           kitchenware2.Decortate(chair2);
  10:           kitchenware2.Show();

客戶端測試3

1. Line4~Line8 :將裝飾物預先(依序)置放於陣列中

2. Line9~Line12: bdList[i]裝飾bdList[i-1]

3. 列印最後一個物件bdList[bdList.Count-1],即列印廚具,而廚具包含(木製椅),木製椅又包含(電燈泡),電燈泡又包含(沙發),沙發又包含(Ryan’s House),因此物件鏈可以一路執行列印動作…。

 

image

image

image

 

   1: Console.WriteLine("(1)儲存序列於陣列型態...");
   2:           Building[] bdList = new Building[5];
   3:          
   4:           bdList[0] = new Building("Ryan's House");
   5:           bdList[1] = new Sofa();
   6:           bdList[2] = new BulbLight();
   7:           bdList[3] = new WoodenChair();
   8:           bdList[4] = new Kitchenware();
   9:           for(int i=bdList.Length-1; i>=1; i-- )
  10:           {
  11:               bdList[i].Decortate(bdList[i - 1]);
  12:           }
  13:           bdList[bdList.Length - 1].Show();

 

改成下列排列方式,對於裝飾順序較為直覺(裝飾順序和執行順序一致)。

1. 最外層放在第1個索引,往內一層放在第2個索引,以此類推…。

2. Line 10~13: bdList[i]裝飾bdList[i+1],與方塊流程執行順序一致(直覺)。

3. bdList[0].Show()開始物件鏈執行,也是執行第一個方塊圖。

image

image

   1: Building[] bdList = new Building[5];
   2: bdList[0] = new Kitchenware();
   3: bdList[1] = new WoodenChair();
   4: bdList[2] = new BulbLight();
   5: bdList[3] = new Sofa();
   6: bdList[4] = new Building("Ryan's House");
   7:  
   8:  
   9:  
  10: for (int i = 0; i <bdList.Length-1; i++)
  11: {
  12:     bdList[i].Decortate(bdList[i+1]);
  13: }
  14: bdList[0].Show();

 

客戶端測試4

image

1. Line3~Line7 :將裝飾物預先(依序)置放於List中

2. Line8~Line11: bdList2[i]裝飾bdList2[i-1]

3. 列印最後一個物件bdList2[bdList.Length-1],即列印廚具,而廚具包含(木製椅),木製椅又包含(電燈泡),電燈泡又包含(沙發),沙發又包含(Ryan’s House),因此物件鏈可以一路直行列印動作…。

   1: Console.WriteLine("(2)儲存序列於List型態...");
   2:           List<Building> bdList2 = new List<Building>();
   3:           bdList2.Add(new Building("Ryan's House"));
   4:           bdList2.Add(new Sofa());
   5:           bdList2.Add(new BulbLight());
   6:           bdList2.Add(new WoodenChair());
   7:           bdList2.Add(new Kitchenware());   
   8:           for(int i=bdList2.Count-1; i>=1; i--)
   9:           {
  10:               bdList2[i].Decortate(bdList2[i - 1]);
  11:           }
  12:           bdList2[bdList.Length - 1].Show();

客戶端測試5

image

1. Line3 :將裝飾物 bdList2[1]~bdList2[ bdList2.Count-1 ]儲存序列顛倒

2. Line4~Line7: bdList2[i]裝飾bdList2[i-1]

3. 列印最後一個物件bdList2[bdList.Length-1],即列印沙發,而沙發包含(電燈泡),電燈泡又包含(木製椅),木製椅又包含(廚具),廚具又包含(Ryan’s House),因此物件鏈可以一路直行列印動作…。

   1: Console.WriteLine("(3) 顛倒List序列...後");
   2:  
   3:            bdList2.Reverse(1, bdList2.Count-1);
   4:            for (int i = bdList2.Count - 1; i >= 1; i--)
   5:            {
   6:                bdList2[i].Decortate(bdList2[i - 1]);
   7:            }
   8:            bdList2[bdList.Length - 1].Show();
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()