美文网首页
适配器模式(PHP实现)

适配器模式(PHP实现)

作者: Tauruse | 来源:发表于2018-05-09 09:11 被阅读176次

早上帮别人写适配器模式的题目时一时之间想不起来,过后花了点时间进行整理,特意记录下来;

参考地址: 适配器模式

场景描述

比如现在有一个支付工具Paypal,通过调用$Paypal->sendPayment($amount)就可以进行支付,但是过了一段时间,这个调用方法名称改变了,或者是改用其它支付工具,显然将每个调用到这个方法的代码都改动一次是不太现实的,这个时候就可以考虑使用适配器模式进行封装;

原始代码

两种支付工具的代码

class Paypal{
    public function sendPayment($amount){
        echo "pay by Paypal:".$amount."<br>";
    }
}
class Skrill{
    public function doPayment($amount){
        echo "pay by Skrill:".$amount."<br>";
    }
}

调用方式:

$paypal = new $Paypal();
$paypal->sendPayment(50);//通过Paypal进行支付
$skrill = new Skrill();
$skrill->doPayment(50);//通过Skrill进行支付

适配器模式

class Adapter implements PayMethod{
    private $adapter;
    function __construct($adaptee){
        $this->adapter = $adaptee;
    }
    public function pay($amount){
        //判断是哪个类
        $className = get_class($this->adapter);
        if($className == "Paypal"){
            $this->adapter->sendPayment($amount);
        }elseif ($className == "Skrill") {
            $this->adapter->doPayment($amount);
        }
    }
}

调用方式:

$paypal = new Paypal();
$adapter = new Adapter($paypal);
$adapter->pay(50);//通过paypal付款

$Skrill = new Skrill();
$adapter = new Adapter($Skrill);
$adapter->pay(50);//通过Skrill付款

或者直接将类的声明封装在适配器的内部:

class Adapter implements PayMethod{
    private $adapter;
    function __construct($className){
        if(strtolower($className) == "paypal"){
            $this->adapter = new Paypal();
        }elseif (strtolower($className) == "skrill") {
            $this->adapter = new Skrill();
        }
    }
    public function pay($amount){
        //判断是哪个类
        $className = get_class($this->adapter);
        if($className == "Paypal"){
            $this->adapter->sendPayment($amount);
        }elseif ($className == "Skrill") {
            $this->adapter->doPayment($amount);
        }
    }
}

调用方式:

$adapter = new Adapter('paypal');
$adapter->pay(50);//通过paypal付款

$adapter = new Adapter('Skrill');
$adapter->pay(50);//通过Skrill付款

运行结果:

pay by Paypal:50
pay by Skrill:50

总结

在这个适配器模式的基础上,以后如果有新的支付方式出现,则直接在Adapter内部添加新的类和方法即可,调用还是统一通过$adapter->pay()进行调用

以上代码可能细节上没有考虑很周全,但是大致是这个思路,仅供参考。

相关文章

  • 适配器模式

    目录 1、什么是适配器模式? 2、适配器模式结构? 3、如何实现适配器模式? 4、适配器模式的特点? 5、适配器模...

  • 适配器模式(PHP实现)

    早上帮别人写适配器模式的题目时一时之间想不起来,过后花了点时间进行整理,特意记录下来; 参考地址: 适配器模式 场...

  • 适配器模式(php实现)

    在这个有没有对象都要高呼“面向对象”的年代,掌握面向对象会给我们带来意想不到的方便。学编程的小伙伴从开始能写几行代...

  • PHP设计模式(二)-适配器模式

    layout: posttitle: "PHP设计模式(二)-适配器模式"date: 2016-06-04 12:...

  • php设计模式(三)适配器模式

    适配器模式 适配器模式将截然不同的函数接口封装成统一的api 实际应用:php数据操作有mysql、mysqli、...

  • 结构型-Adapter

    适配器模式的原理与实现 适配器模式 的英文翻译是 Adapter Design Pattern。顾名思义,这个模式...

  • 适配器模式

    一、适配器模式 二、实例代码 披着羊皮的狼 三、STL中的适配器模式 deque就是适配器,使用deque实现了s...

  • 读《大话设计模式》二

    结构型模式 适配器模式 模式动机 适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接...

  • 5. LAMP架构进阶

    4 php-fpm 模式实现LAMP 4.1 实现php-fpm(PHP FastCGI Proces Manag...

  • Java中的适配器模式

    1.概述 在本快速教程中,我们将了解Adapter模式及其Java实现。 2.适配器模式 适配器模式充当两个不兼容...

网友评论

      本文标题:适配器模式(PHP实现)

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