您的位置:首页 > 编程语言 > C#

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

<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#不支持多重继承,不能同时适配多个适配者。当多个适配者需要同一个适配器时,问题就很难解决了。同时在适配器类中想置换某些适配者的方法时很难的一件事情。

适配器模式就给大家介绍到这里,下一篇将给大家介绍桥接模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息