作为中间件的适配器将目标类和适配者解耦,增加了类的透明性和可复用性。
适配器模式通常由三部分组成:
1、Adaptee类,也就是被适配的对象,通常它都是不容许被修改的,所以只能依靠中间件去映射到这个对象的方法上。
2、Target目标抽象类,这是客户端所期望的接口形态,它为适配器提供一个模板。
3、Adapter类,它继承自Target类(或者实现Target接口),在其内部包装一个adaptee对象,并提供到adaptee方法的映射。
/* *需要被适配的类。 */ class Adaptee{ public function specificRequest(){ echo 'Adaptee is called<br>'; } } /** *目标抽象类,也就是客户端所期望的接口形态。 */ interface Target{ public function request(); } /** *适配器类,继承/实现Target抽象接口,并拥有一个私有的被适配者对象。 */ class Adapter implements Target{ private $adaptee; public function __construct(){ $this->adaptee = new Adaptee(); } public function request(){ $this->adaptee->specificRequest(); //实现方法的映射 } } class Client{ public function doAction(Target $target){ //客户端期望的是Target类型 $target->request(); //客户端期望的是Target对象的request方法。 } } $target = new Adapter();//将特殊对象用适配器对象包装起来。 $client = new Client(); $client->doAction($target);//对于客户端来说,调用的就是Target的request()适配器模式一般是在不得已的情况下而使用。比如引入了第三方的类,并且第三方类与现有接口机制不匹配,如果修改第三方类将耗费很大的精力,即使可以修改的情况若遇到第三方类升级的情况又得重新修改升级后的类文件,这势必造成风险不可控。这种情况下用适配者模式可以很好的解决这个问题。