适配器模式

适配器模式

定义

将一个类的接口转换成客户希望的例外一个接口,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体系中,所以我们需要适配器去实现。

应用场景

经过我的理解,我认为适配器适用于,我们需要使用的方法,某个类或接口已经实现,但该类或接口并不直接适用于我们自己的代码体系

·复用现有类的方法,但接口不符合要求

·建立一个类或接口,使他能够整合很多类对象一起工作,而这些类之间没什么关联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值