php设计模式(十)对象适配器模式

对象适配器和上篇的类适配器解决的问题一样;
不过是适配器的另一种实现方式;
示例中只有 Adapter 类有变化;
Adaptee 和 Adapter 部分可以完全一样;
咱直奔主题;

结构

Adaptee:原本已经有的具体类;
Target:目标接口;包含我们希望拥有的方法;
Adapter:适配器类;适配 Adaptee 和 Target;

示例

Adaptee.php

<?php

namespace Baijunyao\DesignPatterns\ClassAdapter;

/**
 * 源类
 *
 * Class Target
 * @package Baijunyao\DesignPatterns\ClassAdapter
 */
class Adaptee
{
    /**
     * 金额
     *
     * @var string
     */
    public $money = '¥34';

    /**
     * 支付
     */
    public function pay()
    {
        echo '支付' . $this->money;
    }
}

Target.php

<?php

namespace Baijunyao\DesignPatterns\ClassAdapter;

/**
 * 目标类接口
 *
 * Interface Target
 * @package Baijunyao\DesignPatterns\ClassAdapter
 */
interface Target
{
    /**
     * 支付
     *
     * @return mixed
     */
    public function pay();

    /**
     * 通知
     *
     * @return mixed
     */
    public function notify();
}

Adapter.php

<?php

namespace Baijunyao\DesignPatterns\ObjectAdapter;

/**
 * 适配器
 *
 * Class Adapter
 * @package Baijunyao\DesignPatterns\ObjectAdapter
 */

class Adapter implements Target
{

    /**
     * Adapter constructor.
     * @param Adaptee $adaptee
     */
    public function __construct(Adaptee $adaptee)
    {
        $this->adaptee = $adaptee;
        $adaptee->money = '$5';
    }

    /**
     * 支付
     *
     * @return mixed|void
     */
    public function pay()
    {
        $this->adaptee->pay();
    }

    /**
     * 通知
     *
     * @return mixed|void
     */
    public function notify()
    {
        echo '通知';
    }
}

运行;
index.php

<?php

namespace Baijunyao\DesignPatterns\ObjectAdapter;

require __DIR__.'/../vendor/autoload.php';

/**
 * 客户端
 *
 * Class Client
 * @package Baijunyao\DesignPatterns\ObjectAdapter
 */
class Client
{
    /**
     * 运行
     */
    public function run()
    {
        // 原本的类的
        $adaptee = new Adaptee();
        $adaptee->pay();
        echo '<br>';

        // 适配器
        $adapter = new Adapter($adaptee);
        $adapter->pay();
        echo '<br>';

        $adapter->notify();
    }
}

$client = new Client();
$client->run();

通过适配后;
我们可以在不改变原本的 Adaptee 类的情况下改变支付的币种;
并且可以灵活的增加新的方法;
相比类适配器;
对象适配器不需要继承;
因此也更加灵活一些;

github示例:https://github.com/baijunyao/design-patterns/tree/master/ObjectAdapter

php对象适配器模式

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共7条评论
白俊遥博客

任志帆 :想问一下  在Adapter类的__construct方法中   public function __construct(Adaptee $adaptee) { $this->adaptee = $adaptee; $adaptee->money = '$5'; }adaptee 这个属性并没有在此类中声明  这样也可以进行调用  这是什么原理     我自己试了下确实也不报错 但是我在__construct 只使用var_dump($this->adaptee) 会报错Recoverable fatal error: Object of class Renzhifan\DesignPatterns\ObjectAdapter\Adaptee could not be converted to string

2019-02-27 15:47:12 回复

白俊遥博客

NULL :PHP 给类增加成员属性,但是你打印的时候是还没有添加这个成员属性,所以找不到

2019-03-18 16:23:07 回复

白俊遥博客

苏妞尔 :于是我发现了有js注入漏洞,请楼主赶快修复var a = ""+"alert()"+"";

2018-09-10 17:31:11 回复

白俊遥博客 白俊遥博客

云淡风晴 :于是并没有测试成功;

2018-10-20 22:07:31 回复

白俊遥博客

rebirthway :貌似有人在卖你的代码.....Thinkphp3.2.3实现auth权限管理系统演示下载(二当家的后台权限)收藏来源:http://www.erdangjiade.com/php/2634.html二当家的 2017-05-24 17:50浏览(5466)Thinkphp3.2.3实现auth权限管理系统演示下载(二当家的后台权限)1、请不要问“在不在”之类的问题,有问题直接问!2、学生或暂时没有工作的童鞋,99元整站资源免费下载!3、充值VIP会员,整站资源无任何限制下载!5、程序员加油,交流群:368848856 在线 充值

2018-09-07 22:11:48 回复

白俊遥博客 白俊遥博客

云淡风晴 :挺多卖的;没事;

2018-10-20 22:08:21 回复

白俊遥博客

+++ :666,你工作几年了啊? 这么厉害的。。。

2018-09-02 16:33:34 回复