>>返回《C#常用设计模式》
1. 简介
- 概述
- 解决的问题
- 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
- 适配器模式中的角色
- 目标接口(Target):程序调用所期待的接口。目标可以是具体的或抽象的类,也可以是接口;
- 需要适配的类(Adaptee):需要被适配的类或适配者类;
- 适配器(Adapter):通过包装一个适配两者的对象,将原接口与目标接口适配;
- 比喻:好比手机充电,不同的国家使用不同电压的电源,我们手机充电需要不同的适配器来适配电压
- Adaptee: 家用电源
- Target: 手机电源接口
- Adapter: 手机充电器
- 适配器模式的类图
![](https://img2020.cnblogs.com/blog/410194/202102/410194-20210216080023083-1740558766.png)
适配接口可采用实现Target接口和继承Adaptee类的方式。
![](https://img2020.cnblogs.com/blog/410194/202102/410194-20210216080040450-1275339101.png)
适配两个类,可采用继承Target类和依赖Adaptee对象的方式
2. 示例
/// <summary>
/// 定义客户端期待的接口
/// </summary>
public class Target
{
/// <summary>
/// 使用virtual修饰以便子类可以重写
/// </summary>
public virtual void Request()
{
Console.WriteLine("This is a common request");
}
}
/// <summary>
/// 定义需要适配的类
/// </summary>
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("This is a special request.");
}
}
/// <summary>
/// 定义适配器
/// </summary>
public class Adapter:Target
{
// 建立一个私有的Adeptee对象
private Adaptee adaptee = new Adaptee();
/// <summary>
/// 通过重写,表面上调用Request()方法,变成了实际调用SpecificRequest()
/// </summary>
public override void Request()
{
adaptee.SpecificRequest();
}
}
//Client代码
class Program
{
static void Main(string[] args)
{
// 对客户端来说,调用的就是Target的Request()
Target target = new Adapter();
target.Request();
Console.Read();
}
}
3. 说明
- 适配器模式是典型的面向抽象设计
- 已有的抽象实现弃用,而且有可兼容的封装可以使用,则很适合使用此模式
- 比如:sdk更换、数据库访问驱动的更换、数据传输方式的更换等等