C#實例解析適配器設計模式


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

將一個類的接口變成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠一起工作。

適配器模式又叫變壓器模式,也叫包裝模式。

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

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

定義接口代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    /// <summary>
    /// 中國電接口
    /// </summary>
    public interface IChinaElectricity
    {
        /// <summary>
        /// 電壓
        /// </summary>
        /// <returns></returns>
        int Voltage();
    }
    /// <summary>
    /// 日本電接口
    /// </summary>
    public interface IJapanElectricity
    {
        /// <summary>
        /// 電壓
        /// </summary>
        /// <returns></returns>
        int Voltage();
    }
    /// <summary>
    /// 燈接口
    /// </summary>
    public interface IChinaLight
    {
        /// <summary>
        /// 發光
        /// </summary>
        /// <returns></returns>
        string Light(int voltage);
    }
}


定義的類如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    public class ChinaElectricity : IChinaElectricity
    {
        public int Voltage()
        {
            return 220;
        }
    }

    public class JapanElectricity : IJapanElectricity
    {
        public int Voltage()
        {
            return 110;
        }
    }

    public class ChinaLight : IChinaLight
    {
        /// <summary>
        /// 發光
        /// </summary>
        /// <returns></returns>
        public string Light(int voltage)
        {
            if (voltage == 220)
            {
                return "我發光啦....";
            }
            else
            {
                return ("電壓不正確,無法正常工作...");
            }
        }
    }
    /// <summary>
    /// 定義一個電壓適配器
    /// </summary>
    public class ElectricityAdapter : IChinaElectricity
    {
        private int voltage = 0;
        private IJapanElectricity iJElectricity = null;
        
        public ElectricityAdapter(IJapanElectricity _baseElectricity)
        {
            iJElectricity = _baseElectricity;
            voltage = this.iJElectricity.Voltage();
        }
        public int Voltage()
        {
            return voltage + 110;
        }
    }
}

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

        static void Main(string[] args)
        {

            //初始化一個中國電燈
            IChinaLight iCLight = new ChinaLight();
            //初始化中國的電
            IChinaElectricity iCElectricity = new ChinaElectricity();
            //初始化日本電
            IJapanElectricity iJElectricity =new JapanElectricity();

            //使用適配器
            IChinaElectricity iCAElectricity = new ElectricityAdapter(iJElectricity);

            //電壓正確電燈發光
            Console.WriteLine(iCLight.Light(iCElectricity.Voltage()));

            //使用電壓適配器進行適配
            Console.WriteLine(iCLight.Light(iCAElectricity.Voltage()));

            //電壓不正確,電燈產生異常
            Console.WriteLine(iCLight.Light(iJElectricity.Voltage()));
            
        }

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

適配器模式的優點:

適配器模式可以讓兩個沒有任何關系的類在一起運行,只要適配器這個角色能夠搞定他們就行。

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

適配器模式的使用場景:

適配器應用場景只要記住一點就足夠了:你有動機修改一個已經投產中的接口時,適配器模式可能是最適合你的模式。比如系統擴展了,只需要一個已有或新建立的類,但這個類又不符合系統的接口,這個時候使用適配器模式比修改已存在的類代價要小的多。

轉載請保留文章來源:http://www.cnblogs.com/lifeil/archive/2013/02/25/2932178.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM