适配器模式
定义
将一个类的接口转换成客户希望的例外一个接口,Adapter 模式使得原本由于接口不兼容二不能一起工作的那些类可以一起工作。
角色
Target(目标类):客户希望使用的类或接口
Adaptee(被适配的类):需要被适配的类
Adapter(适配器):继承自Target,包装一个Adaptee的对象,并将其接口的原方法转换为目标类的方法
UML图
代码
Target类或接口
namespace DesignModel.Adapter
{
public interface Target
{
void Request();
}
}
Adaptee
namespace DesignModel.Adapter
{
public class Adaptee
{
public void SpecificRequest()
{
Debug.Log("Specific Request!");
}
}
}
Adapter
namespace DesignModel.Adapter
{
public class Adapter : Target
{
Adaptee adaptee = new Adaptee();
public void Request()
{
adaptee.SpecificRequest();
}
}
}
Client
using DesignModel.Adapter;
public class Client_Adapter : MonoBehaviour
{
void Start ()
{
Target tar = new Adapter();
tar.Request();
}
}
举例
我有一根小米数据线,一个安卓充电器和一根苹果数据线,现在我想让苹果数据线插在安卓充电器上
图例
代码
定义安卓充电器和IOS充电器
namespace DesignModel.Adapter
{
public class AndroidPowerPack
{
private string power = string.Empty;
public string Power
{
get{ return power; }
}
public AndroidPowerPack(string power)
{
this.power = power;
}
public void Charge()
{
Debug.Log("Use Android Power Pack : " + power);
}
public void ShowPowerPackName()
{
Debug.Log("当前使用 Andorid Power Pack");
}
}
public class IOSPowerPack
{
private string power;
public string Power
{
get{ return power; }
}
public IOSPowerPack(string power)
{
this.power = power;
}
public void Charge()
{
Debug.Log("Use IOS Power Pack + " + power);
}
public void ShowPowerPackName()
{
Debug.Log("当前使用 IOS Power Pack");
}
}
}
安卓接口和IOS接口
namespace DesignModel.Adapter
{
//安卓接口
public interface IAndroidInterface
{
void Charge(AndroidPowerPack powerPack);
}
//IOS接口
public interface IIOSInterface
{
void Charge(IOSPowerPack powerPack);
}
}
小米数据线和苹果数据线
namespace DesignModel.Adapter
{
public class MiLine : IAndroidInterface
{
public MiLine()
{
Debug.Log("取一根小米数据线");
}
public void Charge(AndroidPowerPack powerPack)
{
Debug.Log("小米数据线充电 :");
powerPack.ShowPowerPackName();
powerPack.Charge();
}
}
public class AppleLine :IIOSInterface
{
public AppleLine()
{
Debug.Log("取一根苹果线");
}
public void Charge(IOSPowerPack powerPack)
{
Debug.Log("苹果线充电: ");
powerPack.ShowPowerPackName();
powerPack.Charge();
}
}
}
苹果线转安卓转接头
namespace DesignModel.Adapter
{
public class IToAPowerPack : IAndroidInterface
{
private IIOSInterface iosLine;
public IToAPowerPack(IIOSInterface iosLine)
{
this.iosLine = iosLine;
}
public void Charge(AndroidPowerPack powerPack)
{
powerPack.ShowPowerPackName();
IOSPowerPack iOSPowerPack = new IOSPowerPack(powerPack.Power); //IOS接口
Debug.Log("Android power To IOS power");
iosLine.Charge(iOSPowerPack); //接IOS线
}
}
}
应用场景,只有安卓充电器的情况下
using DesignModel.Adapter;
public class Client_AndroidCharger : MonoBehaviour
{
AndroidPowerPack powerPack = new AndroidPowerPack("5V"); //安卓充电器 电压5V
void Start ()
{
IAndroidInterface miLine = new MiLine(); //小米线
miLine.Charge(powerPack); //接安卓充电器
IIOSInterface appleLine = new AppleLine(); //苹果线
// appleLine.Charge(powerPack); //无法用安卓充电器接苹果线
IAndroidInterface iToA = new IToAPowerPack(appleLine); //IOS线转android转接口, 传入IOS线
iToA.Charge(powerPack); //插入安卓充电器
}
}
结果
在本例中,定义了IOSPowerPack,而实际应用中,可能并没有所谓的IOSPowerPack,而只是Appline用一种我们不知道的方式实现了Charge,但我们需要将Appline适配到我们的AndroidPowerPack——AndroidLine体系中,所以我们需要适配器去实现。
应用场景
经过我的理解,我认为适配器适用于,我们需要使用的方法,某个类或接口已经实现,但该类或接口并不直接适用于我们自己的代码体系
·复用现有类的方法,但接口不符合要求
·建立一个类或接口,使他能够整合很多类对象一起工作,而这些类之间没什么关联