适配器模式还有一个名字叫包装器模式;
其实很容易理解;
因为现实中我们天天都在用;
就比如说手机充电器;
墙上的插孔装修完后就不在变了;
手机买回来后我们也不会去改造它;
如何让不变的插孔和不变的手机之间能连上充电;
并且把220V转换为5V;
这时候就需要电源适配器了;
软件开发中也是同样的道理;
在软件中适配器分为类适配器和对象适配器;
我们先来讲类适配器;
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\ClassAdapter;
/**
* 适配器
*
* Class Adapter
* @package Baijunyao\DesignPatterns\ClassAdapter
*/
class Adapter extends Adaptee implements Target
{
/**
* Adapter constructor.
*/
public function __construct()
{
$this->money = '$5';
}
/**
* 通知
*/
public function notify()
{
echo '通知';
}
}
运行;
index.php
<?php
namespace Baijunyao\DesignPatterns\ClassAdapter;
require __DIR__.'/../vendor/autoload.php';
/**
* 客户端
*
* Class Client
* @package Baijunyao\DesignPatterns\ClassAdapter
*/
class Client
{
/**
* 运行
*/
public function run()
{
// 原本的类的
$adaptee = new Adaptee();
$adaptee->pay();
echo '<br>';
// 适配器
$adapter = new Adapter();
$adapter->pay();
echo '<br>';
$adapter->notify();
}
}
$client = new Client();
$client->run();
通过适配后;
我们可以在不改变原本的 Adaptee 类的情况下改变支付的币种;
并且可以灵活的增加新的方法;
github示例:https://github.com/baijunyao/design-patterns/tree/master/ClassAdapter
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
最新评论