适配器模式
Adapter,将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
通俗一点,就好比我们各自的方言,需要有一个精通这种语言的和我们能听得懂的语言的人来为我们翻译。方便我们去知道另一方说的是什么意思。
目的是使控制范围之外的一个原有对象与某个接口匹配。主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
代码结构
结构图
代码(角色)
Target(这是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口):
/// <summary>
/// Target(这是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口)
/// </summary>
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
Adaptee(需要适配的类,即需要翻译的类):
/// <summary>
/// Adaptee(需要适配的类,即需要翻译的类)
/// </summary>
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求!");
}
}
Adapter(通过在内部包装一个Adaptee对象,把源接口转换成目标接口):
/// <summary>
/// Adapter(通过在内部包装一个Adaptee对象,把源接口转换成目标接口)
/// </summary>
class Adapter:Target
{
private Adaptee adaptee = new Adaptee(); //建立一个私有的Adaptee对象
public override void Request() //这样就可以把表面上调用Request()方法变成实际调用SpecificRequest()
{
adaptee.SpecificRequest();
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request(); //对于客户端来说,调用的就是Target的Request()
Console.ReadKey();
}
}
使用环境
使用一个已经存在的类,但如果它的接口,也就是它的方法和我们的要求不相同时,并且双方都不太容易修改的时候再使用适配器模式适配,一般在软件开发后期或者维护期使用。
优点
1、将目标类和适配者类解耦
2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3、灵活性和扩展性都非常好,符合开闭原则
类适配器还有的优点
由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
类适配器的缺点
对于C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
对象适配器还有的优点
把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
对象适配器的缺点
与类适配器模式相比,要想置换适配者类的方法就不容易。