适配器设计模式是把一个类的接口转化成客户端期望的接口,从而使原本接口不匹配的两个类能一起工作。
实际中这种场景很容易碰到,比如A类型手机充电器需要10V电压充电,B类型手机需要15V电压充电。A类型手机的充电器价格非常昂贵,而B类型的充电器价格低廉。市场就有可能出现把B型充电器转换成A型手机匹配的适配器。
适配器设计模式有两种:
类适配器:使用继承实现接口转换。
实例适配器:使用组合实现接口转换。
类适配器
类图:
类适配器设计的角色:
源:被适配的类。
目标:客户期望的接口.由于适配器需要继承源。所以目标必须是接口。
适配器:把源接口转换成目标接口。适配器需要继承源。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hbb0b0.DesignPatter
{
/// <summary>
/// 源:被适配者
/// </summary>
public class Adaptee
{
/// <summary>
/// 响应特殊的请求
/// </summary>
public void SpecialRequest()
{
Console.WriteLine("Call SpecialRequest");
}
}
/// <summary>
/// 目标:客户端期望的接口。必须是接口
/// </summary>
public interface ITarget
{
/// <summary>
/// 客户端期望的响应请求方法
/// </summary>
void Request();
}
/// <summary>
/// 适配器
/// </summary>
public class ClassAdapter : Adaptee,ITarget
{
#region ITarget 成员
/// <summary>
/// 实现期望的接口
/// </summary>
public void Request()
{
base.SpecialRequest();
}
#endregion
}
}
调用示例:
//类适配器
Console.WriteLine("类适配器");
ITarget iTarget = new ClassAdapter();
iTarget.Request();
实例适配器
类图
实例适配器设计的角色:
源:被适配的类。
目标:客户期望的接口.由于适配器中包装源。所以目标可以是类,抽象类,接口。
适配器:把源接口转换成目标接口。适配器包装源。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hbb0b0.DesignPatter
{
/// <summary>
/// 源:被适配者
/// </summary>
public class Adaptee
{
/// <summary>
/// 响应特殊的请求
/// </summary>
public void SpecialRequest()
{
Console.WriteLine("Call SpecialRequest");
}
}
/// <summary>
/// 目标:客户端可以期望接口,可以是具体类也可以是抽象类,
/// 也可以是接口
/// </summary>
public class Target
{
/// <summary>
/// 期望的方法
/// </summary>
virtual public void Request()
{
}
}
}
/// <summary>
/// 适配器:内部包装源,把源接口转换成目标接口
/// </summary>
public class InstanceAdapter : Target
{
private Adaptee adaptee = null;
public InstanceAdapter(Adaptee adt )
{
adaptee = adt;
}
public override void Request()
{
adaptee.SpecialRequest();
}
}
}
调用示例:
//对象适配器
Console.WriteLine("对象适配器");
Adaptee adt=new Adaptee ();
Target target = new InstanceAdapter(adt );
target.Request();