适配器模式将一个接口转换成另外一个接口,以符合客户的期望。
举个例子说明一下:
我需要使用一个新的组件来替换掉我系统中已经过时了的组件,所以我使用了一个第三方组件,而这个组件当中的接口的名字居然都是用中文写的(这个可能是开发这个组件的程序员的问题所造成的),而我现有的系统中的的旧有的组件的接口中确是通过英文来调用的组件,而由于系统过于复杂,所以我便选择了使用适配器模式来解决这个问题。
Target 类(Target 类代表能够被客户端使用的接口):
namespace Adapter
{
public abstract class Target
{
//温度
/// <summary>
/// 下面的接口才是可以被客户端所识别的接口,也就是目标接口
/// 而前面在被适配器类中的中文却不能被客户端识别,需要被适配
/// </summary>
public abstract void GetTemperature();
//气压
public abstract void GetPressure();
//湿度
public abstract void GetHumidity();
//紫外线强度
public abstract void GetUltraviolet();
}
}
被适配的类 Adaptee(Adaptee 中的接口由于不能被客户端识别,所以需要被适配):
using System;
namespace Adapter
{
class Adaptee
{
/// <summary>
/// 在被适配器类中的接口并不是客户端需要的接口
/// 比如这里是使用的中文,而我在客户端却必须要使用英文
/// 所以在这里我必须使用适配器来适配
/// </summary>
public void 得到温度()
{
Console.WriteLine("您得到了今日的温度");
}
public void 得到气压()
{
Console.WriteLine("您得到了今日的气压");
}
public void 得到湿度()
{
Console.WriteLine("您得到了今日的湿度");
}
public void 得到紫外线强度()
{
Console.WriteLine("您得到了今日的紫外线强度");
}
}
}
适配器(适配器将不能被客户端识别的接口间接转换为可以被识别的接口):
namespace Adapter
{
public class Adapter:Target
{
//在适配器中必须要维护一个被适配器类的对象
private Adaptee adaptee = new Adaptee();
/// <summary>
/// 通过适配器来适配原来不能被客户端所认识的接口
/// </summary>
public override void GetTemperature()
{
adaptee.得到温度();
}
public override void GetPressure()
{
adaptee.得到气压();
}
public override void GetHumidity()
{
adaptee.得到湿度();
}
public override void GetUltraviolet()
{
adaptee.得到紫外线强度();
}
}
}
客户端:
using System;
namespace AdapterTest
{
class Program
{
static void Main(string[] args)
{
//实例化一个适配器给目标接口
Adapter.Target target = new Adapter.Adapter();
//下面的这些就是客户端可以被识别了接口了
target.GetTemperature();
target.GetPressure();
target.GetHumidity();
target.GetUltraviolet();
Console.ReadKey();
}
}
}
可以看出,上面的适配器就是一个中介人,它把本来客户端的请求转换成了 Adaptee 所代表的接口所能理解的请求。或者说是,把本来客户端不认识的 Adaptee 间接介绍给了客户端认识,不过注意是间接。