C#實(shí)例解析適配器設(shè)計(jì)模式
今天看到一個(gè)園子里的朋友寫(xiě)了一篇ASP.NET的適配器設(shè)計(jì)模式的文章。其中提到了把輸入的電壓轉(zhuǎn)換成燈泡適合的電壓,這樣才能使燈泡正常工作。正巧,我也在學(xué)習(xí)設(shè)計(jì)模式,其中翻看了一下秦小波寫(xiě)的《設(shè)計(jì)模式與禪》這本書(shū),其中提到了設(shè)計(jì)模式的定義為:
| 
             將一個(gè)類(lèi)的接口變成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠一起工作。 適配器模式又叫變壓器模式,也叫包裝模式。  | 
        
這里作者舉得例子并沒(méi)有實(shí)現(xiàn)把一個(gè)接口或類(lèi)轉(zhuǎn)換到另外一個(gè)可以使用的類(lèi),僅僅是把輸入?yún)?shù)做了判斷,這是不是適配器模式我不予置評(píng),下面貼出我實(shí)現(xiàn)的適配器模式。
我們知道,中國(guó)的電壓是220V,而日本的電壓為110V,我們中國(guó)生產(chǎn)的電燈泡一般額定電壓為220V,如果想要這個(gè)燈泡在日本能夠正常工作就必須使用一個(gè)適配器,把110V電壓轉(zhuǎn)換成220V電壓。
定義接口代碼如下:
- using System;
 - using System.Collections.Generic;
 - using System.Linq;
 - using System.Text;
 - namespace HelloWorld
 - {
 - /// <summary>
 - /// 中國(guó)電接口
 - /// </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>
 - /// 發(fā)光
 - /// </summary>
 - /// <returns></returns>
 - string Light(int voltage);
 - }
 - }
 
定義的類(lèi)如下:
- 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>
 - /// 發(fā)光
 - /// </summary>
 - /// <returns></returns>
 - public string Light(int voltage)
 - {
 - if (voltage == 220)
 - {
 - return "我發(fā)光啦....";
 - }
 - else
 - {
 - return ("電壓不正確,無(wú)法正常工作...");
 - }
 - }
 - }
 - /// <summary>
 - /// 定義一個(gè)電壓適配器
 - /// </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;
 - }
 - }
 - }
 
這里面我們定義了一個(gè)適配器的類(lèi),把日本電壓適配成中國(guó)電壓,這樣才能夠使燈泡正常工作。代碼如下:
- static void Main(string[] args)
 - {
 - //初始化一個(gè)中國(guó)電燈
 - IChinaLight iCLight = new ChinaLight();
 - //初始化中國(guó)的電
 - IChinaElectricity iCElectricity = new ChinaElectricity();
 - //初始化日本電
 - IJapanElectricity iJElectricity =new JapanElectricity();
 - //使用適配器
 - IChinaElectricity iCAElectricity = new ElectricityAdapter(iJElectricity);
 - //電壓正確電燈發(fā)光
 - Console.WriteLine(iCLight.Light(iCElectricity.Voltage()));
 - //使用電壓適配器進(jìn)行適配
 - Console.WriteLine(iCLight.Light(iCAElectricity.Voltage()));
 - //電壓不正確,電燈產(chǎn)生異常
 - Console.WriteLine(iCLight.Light(iJElectricity.Voltage()));
 - }
 
通過(guò)適配器模式的定義可以知道,其實(shí)適配器模式無(wú)非是把一種已經(jīng)無(wú)法修改,或是修改成本較高的源角色通過(guò)適配角色轉(zhuǎn)換成目標(biāo)角色,這樣整個(gè)業(yè)務(wù)體系才能夠在代價(jià)最小的情況下進(jìn)行正常運(yùn)行。
適配器模式的優(yōu)點(diǎn):
適配器模式可以讓兩個(gè)沒(méi)有任何關(guān)系的類(lèi)在一起運(yùn)行,只要適配器這個(gè)角色能夠搞定他們就行。
- 增加了類(lèi)的透明性。
 - 提高了類(lèi)的復(fù)用度。
 - 靈活性非常好。
 
適配器模式的使用場(chǎng)景:
適配器應(yīng)用場(chǎng)景只要記住一點(diǎn)就足夠了:你有動(dòng)機(jī)修改一個(gè)已經(jīng)投產(chǎn)中的接口時(shí),適配器模式可能是最適合你的模式。比如系統(tǒng)擴(kuò)展了,只需要一個(gè)已有或新建立的類(lèi),但這個(gè)類(lèi)又不符合系統(tǒng)的接口,這個(gè)時(shí)候使用適配器模式比修改已存在的類(lèi)代價(jià)要小的多。
原文鏈接:http://www.cnblogs.com/lifeil/archive/2013/02/25/2932178.html















 
 
 










 
 
 
 