Home » Code » 常见设计模式之——适配器模式

常见设计模式之——适配器模式

何为适配器?生活中电源适配器相信大家都懂,就是将不符合要求的电压电流转换为符合要求的。在这里,我们没有改变原有的电压电流,只是新增一个东西将它给转换一下。适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作!

在适配器模式中,有以下三种角色:

  • 目标接口(Target),客户所期待的标准接口
  • 需要适配的类(Adaptee),已存在的不符合要求的类,我们需要适配它
  • 适配器(Adapter),对Adaptee进行适配,使之符合Target的要求

比如,我们有希望有这么一个标准的获得天气情况的接口,调用getWeather()方法就能得到天气情况:

//标准接口(Target)
interface Weather
{
	public function getWeather();
}

实际情况下,我们也确实实现了这个接口,只是它只能满足一些情况——只能供PHP程序调用,它返回的是serialize后的数据,这数据移动客户端不认识:

//已有的类,能满足一定需求(能为php程序提供serialize后的数据),
//但不能满足移动端(移动端不认识serialize数据)(Adaptee)
class SerializeWeather implements Weather
{
	public function getWeather()
	{
		$weather = array('temperature' => 20, 'wind' => 4.5);
		return serialize($weather);
	}
}

我们需要对它进行适配,以满足移动客户端的需要:

//适配器,适配某些情况下不能满足要求的SerializeWeather(Adapter)
class JsonWeather extends SerializeWeather implements Weather
{
	private $_adaptee;

	public function __construct()
	{
		$this->_adaptee = new parent;
	}

	public function getWeather()
	{
		$result = $this->_adaptee->getWeather();//接过来数据
		$result = unserialize($result);//还原
		return json_encode($result);//转换一下,适配之
	}
}

适配后,客户端调用的时候直接使用请求适配器就可以了:

//客户端调用
class Client
{
	public function showWeather()
	{
		$weather = new JsonWeather();
		echo $weather->getWeather()."</br>";//客户端只认标准接口的方法

		//某些情况下,需要使用旧接口
		$weather = new SerializeWeather();
		echo $weather->getWeather()."<br/>";//新旧接口可以同时工作满足不同需要
	}
}

$client = new Client();
$client->showWeather();

有了适配器,就使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作!

其实不说什么设计模式,我们也能想到该怎么做。只是前人将这么一套总结起来并给它起个响亮的名字——适配器模式!

参考链接:
http://haolloyin.blog.51cto.com/1177454/346128
http://www.cnblogs.com/wangjq/archive/2012/07/09/2582485.html

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.