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

  • 目的
    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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容