美文网首页
结构型设计模式->适配器模式

结构型设计模式->适配器模式

作者: liu66_net | 来源:发表于2018-12-06 10:04 被阅读0次
  • 目的
    1. 将一个接口转换成客户所需要的另一个接口,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);

相关文章

网友评论

      本文标题:结构型设计模式->适配器模式

      本文链接:https://www.haomeiwen.com/subject/nwkncqtx.html