天天看點

c#設計模式-擴充卡模式

今天看到一個園子裡的朋友寫了一篇ASP.NET的擴充卡設計模式的文章。其中提到了把輸入的電壓轉換成燈泡适合的電壓,這樣才能使燈泡正常工作。正巧,我也在學習設計模式,其中翻看了一下秦小波寫的《設計模式與禅》這本書,其中提到了設計模式的定義為:

将一個類的接口變成用戶端所期待的另一種接口,進而使原本因接口不比對而無法在一起工作的兩個類能夠一起工作。

擴充卡模式又叫變壓器模式,也叫包裝模式。

這裡作者舉得例子并沒有實作把一個接口或類轉換到另外一個可以使用的類,僅僅是把輸入參數做了判斷,這是不是擴充卡模式我不予置評,下面貼出我實作的擴充卡模式。

我們知道,中國的電壓是220V,而日本的電壓為110V,我們中國生産的電燈泡一般額定電壓為220V,如果想要這個燈泡在日本能夠正常工作就必須使用一個擴充卡,把110V電壓轉換成220V電壓。

定義接口代碼如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace HelloWorld  
  6. {  
  7. /// <summary>
  8. /// 中國電接口
  9. /// </summary>
  10. publicinterface IChinaElectricity  
  11.    {  
  12. /// 電壓
  13. /// <returns></returns>
  14. int Voltage();  
  15.    }  
  16. /// 日本電接口
  17. publicinterface IJapanElectricity  
  18. /// 燈接口
  19. publicinterface IChinaLight  
  20. /// 發光
  21. string Light(int voltage);  
  22. }

定義的類如下:

  1.    public class ChinaElectricity : IChinaElectricity  
  2.        public int Voltage()  
  3.        {  
  4. return 220;  
  5.        }  
  6.    public class JapanElectricity : IJapanElectricity  
  7. return 110;  
  8.    public class ChinaLight : IChinaLight  
  9.        /// <summary>  
  10.        /// 發光  
  11.        /// </summary>  
  12.        /// <returns></returns>  
  13.        public string Light(int voltage)  
  14. if (voltage == 220)  
  15.            {  
  16. return"我發光啦....";  
  17.            }  
  18. else
  19. return ("電壓不正确,無法正常工作...");  
  20.    /// <summary>  
  21.    /// 定義一個電壓擴充卡  
  22.    /// </summary>  
  23.    public class ElectricityAdapter : IChinaElectricity  
  24.        private int voltage = 0;  
  25.        private IJapanElectricity iJElectricity = null;  
  26.        public ElectricityAdapter(IJapanElectricity _baseElectricity)  
  27.            iJElectricity = _baseElectricity;  
  28.            voltage = this.iJElectricity.Voltage();  
  29. return voltage + 110;  

這裡面我們定義了一個擴充卡的類,把日本電壓适配成中國電壓,這樣才能夠使燈泡正常工作。代碼如下:

  1. staticvoid Main(string[] args)  
  2. //初始化一個中國電燈
  3.            IChinaLight iCLight = new ChinaLight();  
  4. //初始化中國的電
  5.            IChinaElectricity iCElectricity = new ChinaElectricity();  
  6. //初始化日本電
  7.            IJapanElectricity iJElectricity =new JapanElectricity();  
  8. //使用擴充卡
  9.            IChinaElectricity iCAElectricity = new ElectricityAdapter(iJElectricity);  
  10. //電壓正确電燈發光
  11.            Console.WriteLine(iCLight.Light(iCElectricity.Voltage()));  
  12. //使用電壓擴充卡進行适配
  13.            Console.WriteLine(iCLight.Light(iCAElectricity.Voltage()));  
  14. //電壓不正确,電燈産生異常
  15.            Console.WriteLine(iCLight.Light(iJElectricity.Voltage()));  
  16.        }

通過擴充卡模式的定義可以知道,其實擴充卡模式無非是把一種已經無法修改,或是修改成本較高的源角色通過适配角色轉換成目标角色,這樣整個業務體系才能夠在代價最小的情況下進行正常運作。

擴充卡模式的優點:

擴充卡模式可以讓兩個沒有任何關系的類在一起運作,隻要擴充卡這個角色能夠搞定他們就行。

  • 增加了類的透明性。
  • 提高了類的複用度。
  • 靈活性非常好。