C#设计模式——适配器模式
2016-02-03 14:25
288 查看
适配器模式:
大家有没有想过一个问题,电脑充电为何会有电源适配器?直接220V充电不是很快吗?答案原来在这里,笔记本工作电压很小,如果直接连接220V的电压可能会烧毁笔记本,所以我们需要一个东西来解决这个问题,那就是电源适配器。这是电源适配器,那么在软件工程中,我们又该如何用编码来实现适配器呢?这就是今天我想为大家介绍的适配器模式。
一、定义:
将一个类的接口转换成客户希望的另外一个接口。它可以使接口不兼容的类一起工作。
二、解决问题:
主要解决在软件系统中,常常要将一些“现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
三、对象适配器优缺点:
1、优点:
可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则“。
采用 “对象组合”的方式,更符合松耦合。
2、缺点:
使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
四、应用:
1、适配器模式结构图:
![](http://img.blog.csdn.net/20160203142320211?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
理解结构图:
根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以这种适配器模式称为对象适配器模式。
拿我们书中的例子来说,姚明刚开始到外国,在NBA和外国教练交流,但是姚明听不懂,所以他需要一个翻译。从这里来说,教练是客户端,姚明就是那个适配者类Adaptee,但是姚明有个打篮球的方法是教练需要的,为了让教练能和姚明交流,,需要一个翻译,这个翻译就是适配器类,它包装了“翻译”这个方法,通过它,教练和姚明就接上话了,实现了交流。
2、代码展示:
3、适用情况:
(1)当系统的数据和行为都不正确,但接口不符时,我们考虑用适配器
目的:使控制范围之外的一个原有对象与某个接口匹配。
(2)在使用一个已经存在的类,但如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式:两个类所做的事情相同或相似,但是具有不同的接口时使用它。
(3)双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同就用。
五、总结:
适配器模式将两个不相关的类联系起来,将接口不兼容的问题处理的很漂亮,这就是我对有关适配器模式的理解,有不合理之处,也欢迎大家提出宝贵的意见。
感谢你的阅读!
大家有没有想过一个问题,电脑充电为何会有电源适配器?直接220V充电不是很快吗?答案原来在这里,笔记本工作电压很小,如果直接连接220V的电压可能会烧毁笔记本,所以我们需要一个东西来解决这个问题,那就是电源适配器。这是电源适配器,那么在软件工程中,我们又该如何用编码来实现适配器呢?这就是今天我想为大家介绍的适配器模式。
一、定义:
将一个类的接口转换成客户希望的另外一个接口。它可以使接口不兼容的类一起工作。
二、解决问题:
主要解决在软件系统中,常常要将一些“现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
三、对象适配器优缺点:
1、优点:
可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则“。
采用 “对象组合”的方式,更符合松耦合。
2、缺点:
使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
四、应用:
1、适配器模式结构图:
理解结构图:
根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以这种适配器模式称为对象适配器模式。
拿我们书中的例子来说,姚明刚开始到外国,在NBA和外国教练交流,但是姚明听不懂,所以他需要一个翻译。从这里来说,教练是客户端,姚明就是那个适配者类Adaptee,但是姚明有个打篮球的方法是教练需要的,为了让教练能和姚明交流,,需要一个翻译,这个翻译就是适配器类,它包装了“翻译”这个方法,通过它,教练和姚明就接上话了,实现了交流。
2、代码展示:
//Target class Target { public virtual void Request() { Console.WriteLine("普通请求!"); } } //Adaptee 需要适配的类 class Adaptee { public void SpecificRequest() { //Console.WriteLine("Called SpecificRequest()"); Console.WriteLine("特殊请求!"); } } //Adapter 通过在内部包装一个Adaptee对象,把源接口转换成目标接口 class Adapter : Target { private Adaptee adaptee = new Adaptee();//建立一个私有的Adaptee对象 public override void Request() { adaptee.SpecificRequest();//这样可以把表面上调用Request()方法变成实际调用SpecificRequest() } } //客户端调用 class Program { static void Main(string[] args) { Target target = new Adapter(); target.Request(); Console.Read(); } }
3、适用情况:
(1)当系统的数据和行为都不正确,但接口不符时,我们考虑用适配器
目的:使控制范围之外的一个原有对象与某个接口匹配。
(2)在使用一个已经存在的类,但如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式:两个类所做的事情相同或相似,但是具有不同的接口时使用它。
(3)双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同就用。
五、总结:
适配器模式将两个不相关的类联系起来,将接口不兼容的问题处理的很漂亮,这就是我对有关适配器模式的理解,有不合理之处,也欢迎大家提出宝贵的意见。
感谢你的阅读!
相关文章推荐
- C#开机自启动实现(分析无法启动情况)
- c#之string的不可变性2
- c# 如何隐藏TabControl控件的标签
- C#点击窗口任意位置可拖拽
- C#知识点扫盲——GC(Garbage Collector)
- imos 学习笔记三 下载指定时间段视频信息 c#
- imos 学习笔记三 下载指定时间段视频信息 c#
- C#调用sap接口及返回数据到SAP
- imos学习笔记二 用户登录c#
- imos学习笔记二 用户登录c#
- C#实现与SIMATIC NET OPC DA通讯
- c#之值类型和引用类型
- c#之字符串的不可变性
- C#反射机制总结
- C# PropertyInfo 将一个对象赋值到另一个相同名称的对象
- c# 借助cmd命令解析apk文件信息
- c#之this显示调用构造函数
- C#读书雷达
- C# 清楚Cookies
- C# 反射 设置字段值无效的解决办法