-
目的
- 将一个接口转换成客户所需要的另一个接口,Adapter模式使两个接口原来不兼容而不能在一起工作的类在一起工作.(类似于翻译官,万能充电器)
-
主要角色
1.目标角色(Target) 规定能完成哪些适配
2.源角色(Adaptee)对哪些方法完成适配
3.适配器角色(Adapter)对源角色的适配 -
优点
1.可以让两个没有关系的类在一起工作
2.提高了类的复用
3.增加了类的透明度
4.灵活性好 -
缺点
1.过多的使用适配器会让系统变得比较凌乱,比如明明调用了A接口,方法内部却被适配成了B,如果没有必要可以不必使用适配器.
-
代码
<?php
/**
* 比如现在有一个支付工具Paypal,
* 通过调用$Paypal->sendPayment($amount)就可以进行支付,
* 但是过了一段时间,这个调用方法名称改变了,
* 或者是改用其它支付工具,
* 显然将每个调用到这个方法的代码都改动一次是不太现实的,
* 这个时候就可以考虑使用适配器模式进行封装通过调用Pay方法
*/
//目标角色(Target) 规定适配器能完成哪些适配doPaymentsendPayment
/**
* 源角色(Adaptee)
*/
class Paypal
{
public function sendPayment($amount)
{
echo 'this is Paypal'.$amount."<br />";
}
}
/**
* 源角色(Adaptee)
*/
class Skrill
{
public function doPayment($amount)
{
echo "pay by Skrill:".$amount."<br>";
}
}
/**
* 适配器角色(Adapter)
*/
class Pay
{
private $PayType;
public function __construct($adaptee)
{
$this->PayType = $adaptee;
}
public function pay($amount)
{
$className = get_class($this->PayType);
if($className == 'Paypal')
{
$this->PayType->sendPayment($amount);
}else if($className == 'Skrill')
{
$this->PayType->doPayment($amount);
}
}
}
$paypal = new Paypal();
$Pay = new Pay($paypal);
$Pay->pay(100);
$paypal = new Skrill();
$Pay = new Pay($paypal);
$Pay->pay(50);