C#實現橋接模式

來源:互聯網
上載者:User

圖1

 

 


 

圖2

 

 

我們在面象對象設計中,要遵循依賴倒置原則,也就是說,抽象不依賴於實現細節,而實現細節要依賴於抽象 , 下面兩副圖中,圖1是抽象A依賴實現B,這在某中情況下就是一個不好的做法,比如,我們有這樣一個需求,有一個人事系統,我們做一個用來計算工資的類,然後我們把員工對象當參數傳入,來計算他的工資。

如果按圖1的做法,代碼很容易就寫成了這樣..

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 設計模式
  6. {
  7.     class CountMoney
  8.     {
  9.         public static void Main()
  10.         {
  11.             Employee emp = new Employee() ;
  12.             Manager man = new Manager() ;
  13.             Console.WriteLine( "普通員工的工資:{0}" , CountSalary( PersonType.EmployeeType , emp ) ) ;
  14.             Console.WriteLine( "管理員工的工資:{0}" , CountSalary( PersonType.ManagerType , man ) ) ;
  15.             Console.ReadLine() ;
  16.         }
  17.         public static float CountSalary( PersonType type , Object per )
  18.         {
  19.             float reFloat = 0.0f ;
  20.             if( PersonType.EmployeeType == type )
  21.             {
  22.                 Employee emp = (Employee) per ;
  23.                 reFloat = emp.daySalary * emp.workDayCount ;
  24.             }
  25.             else if ( PersonType.ManagerType == type )
  26.             {
  27.                 Manager emp = (Manager) per ;
  28.                 //管理員一天的工資是200塊
  29.                 reFloat = emp.daySalary * emp.workDayCount ; 
  30.             }
  31.             return reFloat ;
  32.         }
  33.     }
  34.     public enum PersonType
  35.     {
  36.         EmployeeType = 0 ,
  37.         ManagerType = 1 
  38.     }
  39.     class Employee
  40.     {
  41.         public float workDayCount = 30 ;   
  42.         public float daySalary = 200 ;
  43.     }
  44.     class Manager
  45.     {
  46.         public float workDayCount = 28 ;
  47.         public float daySalary = 300 ;
  48.     }
  49. }

通過以上代碼,我們可以看出

CountMoney工資計算類中,我傳用枚舉來判斷傳入的類型,進行相應的轉型,並計算出工次。。這樣寫本身也並沒有什麼錯,但是它不是一個應對變化的好辦法,比如說,除普通員工,管理員外,我們又要加入別的類型的人員,這時,我們的代碼,就不太好擴充,解決辦法一定是,在public static float CountSalary( PersonType type , Object per )方法在再多加一條else if來做判斷,枚舉中再加入一個類型。。這樣的改動未免有些太大了。。這裡其實就是圖1所說的,依賴實現細節,也就是說CountMoney中直接操作了具體的實作類別造成了耦合性,所以,我們要依賴倒置。。下面我們按圖2的方式來寫代碼。

 

首先,我們為瞭解決依賴實作類別的問題,我們要加一層抽像,用來描述各類人員的共性,也就是不變處,試想一下,要計算工資,是不是不管什麼人員,都需要有出勤天數,這樣就行了,至於別的內容,我們是不關心的,所以我們定義一個介面,Person,用來描述出勤天數,其餘的不管是員工,還是管理員,都去實現這個介面。而我們的計算類中,中對介面操作,不依賴具體的實作類別,比如員工類。

按圖2實現之後,我們如果再加入一種類型的人員,只需要加一個類,實現Person介面就行,不需要再改動CountMoney中的代碼,這就符合了開閉原則。

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 設計模式
  6. {
  7.     class CountMoney2
  8.     {
  9.         public static void Main()
  10.         {
  11.             Employee emp = new Employee() ;
  12.             Manager man = new Manager() ;
  13.             Console.WriteLine( "普通員工的工資:{0}" , CountSalary( emp ) ) ;
  14.             Console.WriteLine( "管理員工的工資:{0}" , CountSalary( man ) ) ;
  15.             Console.ReadLine() ;
  16.         }
  17.         public static float CountSalary( Person per )
  18.         {
  19.             float reFloat = 0.0f ;
  20.             reFloat = per.DaySalary * per.WorkDayCount ;
  21.             
  22.             return reFloat ;
  23.         }
  24.     }
  25.     interface Person
  26.     {
  27.         float WorkDayCount{ get;} 
  28.         float DaySalary { get;} 
  29.     }
  30.     class Employee : Person
  31.     {
  32.         public float workDayCount = 30 ;
  33.         #region Person 成員
  34.         public float WorkDayCount
  35.         {
  36.             get { return this.workDayCount ; }
  37.         }
  38.         #endregion
  39.         #region Person 成員
  40.         public float DaySalary
  41.         {
  42.             get { return 200.0f ; }
  43.         }
  44.         #endregion
  45.     }
  46.     class Manager : Person
  47.     {
  48.         public float workDayCount = 28 ;
  49.         #region Person 成員
  50.         public float WorkDayCount
  51.         {
  52.             get { return this.workDayCount ; }
  53.         }
  54.         #endregion
  55.         #region Person 成員
  56.         public float DaySalary
  57.         {
  58.             get { return 300.0f ; }
  59.         }
  60.         #endregion
  61.     }
  62. }

 

未完。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.