C#设计模式06-适配器模式
2016-02-16 15:20
351 查看
在介绍适配器模式之前先举一个生活中的案例。大家都知道,我们国家规定的各种用电电压是220V,我们的电视能直接通220V电压工作,这个时候220V电压和电视就能兼容(正常工作),但是手机,笔记本这些电子设备的工作电压远远低于220V电压,我们如何让他们正常工作呢?这个时候让国家把电压降低明显是不可能的,况且不同的设备都有自己的工作电压,那就是用一个充电器或者适配器,让220V的电压通过充电器或者电源适配器后变成手机,笔记本等设备的工作电压,这样原来不能直接工作的220V电压和手机,笔记本就可以兼容了。
在适配器模式中,电源适配器或者充电器就充当了适配器这个角色,而它要适配的对象也就是220V电压(适配者,被适配的对象),客户端最终想要的就是手机,笔记本可以兼容220V电压。
适配者模式官方定义:将一个类的接口转换成客户所希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
定义里面的接口要和大家说明一下,这里的接口指的是广义的接口,它可以表示一个方法或者多个方法的集合。
当我们不能更换电压也不想更换电压但还想用这个电压的时候,就可以考虑使用适配器模式。也就是当我们想重用一个类(适配者)里面的方法但是又不能修改源代码或者说源代码已经不存在的情况下,就可以在客户端和这个类之间添加一个适配器来解决问题。
适配器模式中主要包含三种角色:
1.Target(目标抽象类):是客户端定义的一个所需要的接口,客户端针对它编程
2.Adapter(适配器类):它是适配器模式的核心,它通过实现Target接口和继承Adaptee适配者类来使两者产生联系。
3.Adaptee(适配者类):它是客户端最终想要的类,这个类中包含了客户端想要调用的业务方法,也是被适配器适配的类
适配器模式分为类适配器和对象适配器两种,接下来我们先来看一下对象适配器器的用法,因为实际开发中,对象适配器用的更多,下面是对象适配器模式的类图
客户端想重用Adaptee这个类里面的RequestSample方法,但是由于没有这个源代码并且我们也不想修改原代码,那就可以用适配器模式来解决。
先来看适配者类Adaptee
然后是适配器来Aapter
最后是我们的客户端类
来看看运行结果吧
客户端通过调用适配器的Request方法实现了对Adaptee类中RequestSample方法的调用。
然后再简单介绍一下类适配器模式,它的类图和对象适配器的类图是一样的。不同的是适配器的代码不一致,在对象适配器模式中,适配器类中有一个适配者类对象,而在类适配器中没有这个对象,而是适配器类继承适配者类,在Request方法中直接调用父类的RequestSample方法,实现对适配者类的重用。代码如下:
实际开发中,这种用的不是太多,可以简单了解一下。
最后简单总结适配器模式的优缺点
优点:适配器模式通过引入一个适配器类来实现目标类和适配者类的解耦,同时可以保证不用修改原来的适配者代码和结构,而且他的扩展非常容易,通过配置文件可以很方便的更换适配器类。
缺点:一次只能适配一个适配者类,因为C#不支持多重继承,不能同时适配多个适配者。当多个适配者需要同一个适配器时,问题就很难解决了。同时在适配器类中想置换某些适配者的方法时很难的一件事情。
适配器模式就给大家介绍到这里,下一篇将给大家介绍桥接模式。
在适配器模式中,电源适配器或者充电器就充当了适配器这个角色,而它要适配的对象也就是220V电压(适配者,被适配的对象),客户端最终想要的就是手机,笔记本可以兼容220V电压。
适配者模式官方定义:将一个类的接口转换成客户所希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
定义里面的接口要和大家说明一下,这里的接口指的是广义的接口,它可以表示一个方法或者多个方法的集合。
当我们不能更换电压也不想更换电压但还想用这个电压的时候,就可以考虑使用适配器模式。也就是当我们想重用一个类(适配者)里面的方法但是又不能修改源代码或者说源代码已经不存在的情况下,就可以在客户端和这个类之间添加一个适配器来解决问题。
适配器模式中主要包含三种角色:
1.Target(目标抽象类):是客户端定义的一个所需要的接口,客户端针对它编程
2.Adapter(适配器类):它是适配器模式的核心,它通过实现Target接口和继承Adaptee适配者类来使两者产生联系。
3.Adaptee(适配者类):它是客户端最终想要的类,这个类中包含了客户端想要调用的业务方法,也是被适配器适配的类
适配器模式分为类适配器和对象适配器两种,接下来我们先来看一下对象适配器器的用法,因为实际开发中,对象适配器用的更多,下面是对象适配器模式的类图
客户端想重用Adaptee这个类里面的RequestSample方法,但是由于没有这个源代码并且我们也不想修改原代码,那就可以用适配器模式来解决。
先来看适配者类Adaptee
<pre name="code" class="csharp">namespace 适配器模式 { //一般是一个具体的类,包含了客户端想要的业务方法 //由于C#不支持多重继承,所以类适配器模式中Target只能为接口 public class Adaptee//适配者类 { public void RequestSample() { Console.WriteLine("我是适配者类!"); } } }
然后是适配器来Aapter
namespace 适配器模式 { public class Adapter:Target { private Adaptee a = new Adaptee(); public void Request() { a.RequestSample(); } } }下面是目标抽象类Target
namespace 适配器模式 { public interface Target { void Request(); } }
最后是我们的客户端类
namespace 适配器模式 { class Program { static void Main(string[] args) { //获取适配器名称 string adapterName = ConfigurationManager.AppSettings["adapterName"]; //通过反射加载适配器名称 Target t = Assembly.Load("适配器模式").CreateInstance(adapterName) as Target; t.Request(); Console.ReadLine(); } } }
来看看运行结果吧
客户端通过调用适配器的Request方法实现了对Adaptee类中RequestSample方法的调用。
然后再简单介绍一下类适配器模式,它的类图和对象适配器的类图是一样的。不同的是适配器的代码不一致,在对象适配器模式中,适配器类中有一个适配者类对象,而在类适配器中没有这个对象,而是适配器类继承适配者类,在Request方法中直接调用父类的RequestSample方法,实现对适配者类的重用。代码如下:
namespace 适配器模式 { public class Adapter:Adaptee,Target { public void Request() { base.RequestSample(); } } }
实际开发中,这种用的不是太多,可以简单了解一下。
最后简单总结适配器模式的优缺点
优点:适配器模式通过引入一个适配器类来实现目标类和适配者类的解耦,同时可以保证不用修改原来的适配者代码和结构,而且他的扩展非常容易,通过配置文件可以很方便的更换适配器类。
缺点:一次只能适配一个适配者类,因为C#不支持多重继承,不能同时适配多个适配者。当多个适配者需要同一个适配器时,问题就很难解决了。同时在适配器类中想置换某些适配者的方法时很难的一件事情。
适配器模式就给大家介绍到这里,下一篇将给大家介绍桥接模式。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#面向对象特征的具体实现及作用详解
- C# 面向对象的基本原则
- 浅谈对c# 面向对象的理解
- Ruby面向对象编程详解
- php学习 面向对象 课件第1/2页
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析