PHP设计模式四:适配器模式

一、什么是适配器模式

  适配器模式有两种:类适配器模式和对象适配器模式。其中类适配器模式使用继承方式,而对象适配器模式使用组合方式。由于类适配器模式包含双重继承,而PHP并不支持双重继承,所以一般都采取结合继承和实现的方式来模拟双重继承,即继承一个类,同时实现一个接口。类适配器模式很简单,但是与对象适配器模式相比,类适配器模式的灵活性稍弱。采用类适配器模式时,适配器继承被适配者并实现一个接口;采用对象适配器模式时,适配器使用被适配者,并实现一个接口。

 

二、什么时候使用适配器模式

  适配器模式的作用就是解决兼容性问题,如果需要通过适配(使用多重继承或组合)来结合两个不兼容的系统,那就使用适配器模式。

 

三、类适配器模式

  以货币兑换为例:

<?php
/**
*	类适配器模式
*                以货币兑换为例
**/

//美元计算类
class DollarCalc
{
	private $dollar;
	private $product;
	private $service;
	public $rate = 1;

	public function requestCalc($product,$service)
	{
		$this->product = $product;
		$this->service = $service;
		$this->dollar = $this->product + $this->service;
		return $this->requestTotal();
	}

	public function requestTotal()
	{
		$this->dollar *= $this->rate;
		return $this->dollar;
	}
}

//欧元计算类
class EuroCalc
{
	private $euro;
	private $product;
	private $service;
	public $rate = 1;

	public function requestCalc($product,$service)
	{
		$this->product = $product;
		$this->service = $service;
		$this->euro = $this->product + $this->service;
		return $this->requestTotal();
	}

	public function requestTotal()
	{
		$this->euro *= $this->rate;
		return $this->euro;
	}
}

//欧元适配器接口
interface ITarget
{
	function requester();
}

//欧元适配器实现
class EuroAdapter extends EuroCalc implements ITarget
{
	public function __construct()
	{
		$this->requester();
	}

	function requester()
	{
		$this->rate = .8111;
		return $this->rate;
	}
}

//客户类
class Client
{
	private $euroRequest;
	private $dollarRequest;

	public function __construct()
	{
		$this->euroRequest = new EuroAdapter();
		$this->dollarRequest = new DollarCalc();
		$euro = "€";
		echo "Euros: $euro" . $this->makeAdapterRequest($this->euroRequest) . "<br />";
		echo "Dollars: $" . $this->makeDollarRequest($this->dollarRequest);
	}

	private function makeAdapterRequest(ITarget $req)
	{
		return $req->requestCalc(40,50);
	}

	private function makeDollarRequest(DollarCalc $req)
	{
		return $req->requestCalc(40,50);
	}
}

$client = new Client();
?>

  

四、对象适配器模式

  以桌面环境转向移动环境为例:

<?php
/**
*	对象适配器模式
*                  从桌面环境转向移动环境
**/

//桌面布局接口
interface IFormat
{
	public function formatCSS();
	public function formatGraphics();
	public function horizontalLayout();
}

//桌面布局类实现
class Desktop implements IFormat
{
	public function formatCSS()
	{
		//调用桌面布局CSS文件
	}

	public function formatGraphics()
	{
		//调用图片
	}
	public function horizontalLayout()
	{
		//桌面水平布局
	}
}

//移动布局接口
interface IMobileFormat
{
	public function formatCSS();
	public function formatGraphics();
	public function verticalLayout();
}

//移动布局类实现
class Mobile implements IMobileFormat
{
	public function formatCSS()
	{
		//调用移动布局CSS文件
	}

	public function formatGraphics()
	{
		//调用图片
	}

	public function verticalLayout()
	{
		//移动垂直布局
	}
}

//移动布局适配器
class MobileAdapter implements IFormat
{
	private $mobile;

	public function __construct(IMobileFormat $mobile)
	{
		$this->mobile = $mobile;
	}

	public function formatCSS()
	{
		$this->mobile->formatCSS();
	}

	public function formatGraphics()
	{
		$this->mobile->formatGraphics();
	}

	public function horizontalLayout()
	{
		$this->mobile->verticalLayout();
	}
}

//客户类
class Client
{
	private $mobile;
	private $mobileAdapter;

	public function __construct()
	{
		$this->mobile = new Mobile();
		$this->mobileAdapter = new MobileAdapter($this->mobile);
		$this->mobileAdapter->formatCSS();
		$this->mobileAdapter->formatGraphics();
		$this->mobileAdapter->horizontalLayout();
	}
}

$client = new Client();
?>

  

 

posted @ 2015-10-24 12:28  疯一样的狼人  阅读(262)  评论(0编辑  收藏  举报