程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#之橋接

C#之橋接

編輯:C#入門知識

前言   前面的幾個篇幅都是在講"部件"的生產已經簡簡單單的使用,以後可能要對"部件"進行升級,不是不對它本身升級,是其它方式的升級,可以讓它配備武器。 有沒有感覺"部件"是越來越強大了,事物的衍變都是有個過程的嘛,必須要越來越完善,這是"IronMan"設計的宗旨。       好了,廢話不多說了,現在所要做的工作就是設計好這個"武器",以便在後面的篇幅中和"部件"很好的結合在一起。來看一下"武器"的定義:   復制代碼  1     /// <summary>  2     /// 武器  3     /// </summary>  4     public abstract class Weapon  5     {  6         /// <summary>  7         /// 攻擊  8         /// </summary>  9         public abstract void Attack(); 10     } 11     /// <summary> 12     /// 激光武器 13     /// </summary> 14     public class LaserWeapon : Weapon 15     { 16  17         public override void Attack() 18         { 19             //LaserAttack 20         } 21     } 22     /// <summary> 23     /// 導彈武器 24     /// </summary> 25     public class MissileWeapon : Weapon 26     { 27  28         public override void Attack() 29         { 30             //MissileAttack 31         } 32     } 復制代碼 這樣看起來好像沒有什麼不妥的,因為出於設計的全面性和以便於以後的擴展,所以要盡可能的想的全面。 "武器"的使用也是要受環境限制或影響的。在這裡怎麼表現出來呢? 先假設兩種壞境的下武器使用,一種是水下,一種是太空中(真空狀態)       復制代碼  1     /// <summary>  2     /// 水下的激光武器  3     /// </summary>  4     public class UnderwaterLaserWeapon : LaserWeapon  5     {  6         public override void Attack()  7         {  8             //邏輯處理  9             base.Attack(); 10             //邏輯處理 11         } 12     } 13     /// <summary> 14     /// 真空狀態下激光武器 15     /// </summary> 16     public class EmptyLaserWeapon : LaserWeapon 17     { 18         public override void Attack() 19         { 20             //邏輯處理 21             base.Attack(); 22             //邏輯處理 23         } 24     } 25     /// <summary> 26     /// 水下的導彈武器 27     /// </summary> 28     public class UnderwaterMissileWeapon : MissileWeapon 29     { 30         public override void Attack() 31         { 32             //邏輯處理 33             base.Attack(); 34             //邏輯處理 35         } 36     } 37     /// <summary> 38     /// 真空下的導彈武器 39     /// </summary> 40     public class EmptyMissileWeapon : MissileWeapon 41     { 42         public override void Attack() 43         { 44             //邏輯處理 45             base.Attack(); 46             //邏輯處理 47         } 48     } 復制代碼         整體的設計是沒有大礙的,在增加一項"武器"類型時也是沒有問題了,同樣遵循著開閉原則。 如果是在添加一種壞境的時候也是遵循著開閉原則的,但是違背了類的單一職責原則,而且這樣的設計繼承關系太多,不易維護難以擴展,如果這個"武器"是多維的,而且是同時的向著多維前面變化的,那麼這個"武器"的結構將會變的龐大無比。 現在應該是"橋接"大展身手的時候了,要在"武器"的兩個(或者更多)變化的方向解耦,把強耦合變成弱聯系。   實現   原來"武器"的結構不變,只需要在其中的一個維度中提取出抽象(實現類接口),然後"武器"(抽象類)引用從維度中提取出的抽象就好了。 我們來看一下結構:   復制代碼  1     /// <summary>  2     ///  環境  3     /// </summary>  4     public interface IEnvironment  5     {  6         /// <summary>  7         /// 環境抽象  8         /// </summary>  9         void EnvironmentJudge(); 10     } 11     /// <summary> 12     /// 水下環境的 13     /// </summary> 14     public class Underwater : IEnvironment 15     { 16  17         public void EnvironmentJudge() 18         { 19             Console.WriteLine("在水下的"); 20         } 21     } 22     /// <summary> 23     /// 真空環境下的 24     /// </summary> 25     public class Empty : IEnvironment 26     { 27  28         public void EnvironmentJudge() 29         { 30             Console.WriteLine("真空下的"); 31         } 32     } 復制代碼 上面是 環境維度的結構,下面來看"武器"類型維度的結構:   復制代碼  1     /// <summary>  2     /// 武器  3     /// </summary>  4     public abstract class Weapon  5     {  6         protected IEnvironment Environment = null;  7         /// <summary>  8         /// 攻擊  9         /// </summary> 10         public abstract void Attack(); 11     } 12     /// <summary> 13     /// 激光武器 14     /// </summary> 15     public class LaserWeapon : Weapon 16     { 17         public LaserWeapon():this(new Underwater()) { }//默認使用環境為水下 18         public LaserWeapon(IEnvironment environment) 19         { 20             base.Environment = environment; 21         } 22         public override void Attack() 23         { 24             //LaserAttack 25             base.Environment.EnvironmentJudge(); 26             Console.WriteLine("激光武器"); 27         } 28     } 29     /// <summary> 30     /// 導彈武器 31     /// </summary> 32     public class MissileWeapon : Weapon 33     { 34         public MissileWeapon():this(new Underwater()) { } 35         public MissileWeapon(IEnvironment environment) 36         { 37             base.Environment = environment; 38         } 39         public override void Attack() 40         { 41             //MissileAttack 42             base.Environment.EnvironmentJudge(); 43             Console.WriteLine("導彈武器"); 44         } 45     }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved