C#实例解析适配器设计模式
今天看到一个园子里的朋友写了一篇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
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的