C#實(shí)例解析適配器設(shè)計(jì)模式
今天看到一個(gè)園子里的朋友寫了一篇ASP.NET的適配器設(shè)計(jì)模式的文章。其中提到了把輸入的電壓轉(zhuǎn)換成燈泡適合的電壓,這樣才能使燈泡正常工作。正巧,我也在學(xué)習(xí)設(shè)計(jì)模式,其中翻看了一下秦小波寫的《設(shè)計(jì)模式與禪》這本書,其中提到了設(shè)計(jì)模式的定義為:
將一個(gè)類的接口變成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠一起工作。 適配器模式又叫變壓器模式,也叫包裝模式。 |
這里作者舉得例子并沒有實(shí)現(xiàn)把一個(gè)接口或類轉(zhuǎn)換到另外一個(gè)可以使用的類,僅僅是把輸入?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);
- }
- }
定義的類如下:
- 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 ("電壓不正確,無法正常工作...");
- }
- }
- }
- /// <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è)適配器的類,把日本電壓適配成中國(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()));
- }
通過適配器模式的定義可以知道,其實(shí)適配器模式無非是把一種已經(jīng)無法修改,或是修改成本較高的源角色通過適配角色轉(zhuǎn)換成目標(biāo)角色,這樣整個(gè)業(yè)務(wù)體系才能夠在代價(jià)最小的情況下進(jìn)行正常運(yùn)行。
適配器模式的優(yōu)點(diǎn):
適配器模式可以讓兩個(gè)沒有任何關(guān)系的類在一起運(yùn)行,只要適配器這個(gè)角色能夠搞定他們就行。
- 增加了類的透明性。
- 提高了類的復(fù)用度。
- 靈活性非常好。
適配器模式的使用場(chǎng)景:
適配器應(yīng)用場(chǎng)景只要記住一點(diǎn)就足夠了:你有動(dòng)機(jī)修改一個(gè)已經(jīng)投產(chǎn)中的接口時(shí),適配器模式可能是最適合你的模式。比如系統(tǒng)擴(kuò)展了,只需要一個(gè)已有或新建立的類,但這個(gè)類又不符合系統(tǒng)的接口,這個(gè)時(shí)候使用適配器模式比修改已存在的類代價(jià)要小的多。
原文鏈接:http://www.cnblogs.com/lifeil/archive/2013/02/25/2932178.html