适配器模式用于:系统的数据和行为都正确,但接口不符时,应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如在需要对早期代码复用一些功能等应用上很有实际价值。
自己翻译就是:已经有了一个早期的抽象的接口或者抽象类,但是现在有一个类的实现和这个接口是不一样的,你现在想为了统一编码,直接用一行代码解决问题,那么这时需要给这个接口和这个类之间添加一个适配器,使得它两头都能满足,而且也满足一行代码解决问题的要求,这时这个适配器类就产生了,它需要实现这个接口,而且在适配器中要有一个那个类的对象,在适配器类中实现时去调用那个类的方法,这样就能实现了。
适配器模式的结构图如下:
代码:
/// <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();
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
// 对客户端来说,调用的就是Target的Request()
Target target = new Adapter();
target.Request();
Console.Read();
}
}
何时使用适配器模式:
两个类所做的事情相同或相似,但是具有不同的接口时要使用它。这样客户端代码可以统一调用同一接口,这样简单、直接、紧凑。