适配器模式(Adapter pattern):将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
1、类适配器使用多重继承对一个接口与另一个接口进行匹配;
2、对象匹配器依赖于对象组合。
参与者
Target
——定义Client使用的与特定领域相关的接口。
Client
——与符合Traget接口的对象协同。
Adaptee
——定义一个已经存在的接口,这个接口需要适配。
Adapter
——对Adaptee的接口与Target接口进行适配
协作
Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。
效果
类适配器和对象适配器有不同的权衡(本质上还是继承与组合的区别)
1、类适配器
1)用一个具体的Adapter类对Adaptee和Target进行匹配;
2)Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
2、对象适配器
1)允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类;
2)重定义Adaptee的行为比较困难。
还有其他的一些因素:
Adapter的匹配程度、可插入的Adapter、使用双向适配器提供透明操作。
何时使用
1)想复用一些现有的类,但接口又与复用环境要求的不一致;
2)使用第三方的组件构建自己的系统时,组件的接口与自己的接口不一致。
别名
包装器Wrapper。
1、类适配器使用多重继承对一个接口与另一个接口进行匹配;
2、对象匹配器依赖于对象组合。
参与者
Target
——定义Client使用的与特定领域相关的接口。
Client
——与符合Traget接口的对象协同。
Adaptee
——定义一个已经存在的接口,这个接口需要适配。
Adapter
——对Adaptee的接口与Target接口进行适配
协作
Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。
效果
类适配器和对象适配器有不同的权衡(本质上还是继承与组合的区别)
1、类适配器
1)用一个具体的Adapter类对Adaptee和Target进行匹配;
2)Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
2、对象适配器
1)允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类;
2)重定义Adaptee的行为比较困难。
还有其他的一些因素:
Adapter的匹配程度、可插入的Adapter、使用双向适配器提供透明操作。
何时使用
1)想复用一些现有的类,但接口又与复用环境要求的不一致;
2)使用第三方的组件构建自己的系统时,组件的接口与自己的接口不一致。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyAdapter
{
class Target
{
public virtual void Request()
{
Console.WriteLine("Target request.");
}
}
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Specific request");
}
}
class Adapter : Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecificRequest();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyAdapter
{
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
Console.ReadKey();
}
}
}
在.NET中的应用
DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便于数据源中的数据相匹配)和Update(这更改了数据源中的数据以便于DataSet中的数据相匹配)来提供这一适配器。(双向适配)
http://referencesource.microsoft.com/#System.Data/System/Data/Common/DataAdapter.cs,e34ddcf42be6b653
相关模式
Bridge模式的结构与对象适配器类似,但是Bridge模式的出发点不同:Bridge目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adapter则意味着改变一个已有对象的接口。
Decorator模式增强了其他对象的功能而同时又不改变它的接口。因此decorator对应用程序的透明性比适配器要好。结果是decorator支持递归组合,而纯粹使用适配器是不可能实现这一点的。
Proxy模式在不改变它的接口的条件下,为另一个对象定义了一个代理。
Bridge pattern结构图
参考《设计模式》、《大话设计模式》