对象适配器和上篇的类适配器解决的问题一样;
不过是适配器的另一种实现方式;
示例中只有 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
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
任志帆 :想问一下 在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 回复
最新评论