php-适配器模式实现

php-适配器模式实现

概述

适配器模式(Adapter) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

我们这里还是以摩托车制造为例。客户要求生产蓝色和红色的踏板摩托车,除颜色外其他属性都一样。我们先前的工艺是把车身喷漆部分单独视作一个流程,现在考虑到流程优化尝试,我们想把车身喷漆这一流程合并到车身组装环节。但并不想破坏原来的流程,所以我们需要定制两套车身组装标准(新标准基于原有标准的拓展)。此时我们就需要利用适配器模式来实现。具体代码实现如下。

模式结构

类结构型模式

  1. MotorcycleProduce-摩托组装抽象类:建立摩托组装标准工艺 Target 目标类
  2. MotocycleProduct 摩托车产品本身
  3. motorcycleScooter 摩托车组装- Adapter 适配器类
  4. motorcycleScooterAdapter 摩托车组装-Adaptee 适配者类

对象结构型模式

  1. MotorcycleProduce-摩托组装抽象类:建立摩托组装标准工艺 Target 目标类
  2. MotocycleProduct 摩托车产品本身
  3. motorcycleScooter 摩托车组装- Adapter 适配器类
  4. motorcycleScooterAdapter 摩托车组装-Adaptee 适配者类

UML图例

类结构型模式

在这里插入图片描述

对象结构型模式

在这里插入图片描述

代码实例

类结构型模式

<?php 
namespace Adapter;
//抽象类-定义生产摩托车流水线标准  Target 目标类
interface  MotorcycleProduce 
{
    //发动机方法
    public function addEngine();
    //车身方法
    public function addBody();
    public function addBodyAndSetColor(string $color);
    //车轮方法
    public function addWhell();
    //喷漆方法
    public function setBodyColor(string $color);
    //获取摩托
    public function getMotor();
}
//摩托车产品本身
class MotocycleProduct{
    private $motor = [
        "engine"=>"",
        "body"=>"",
        "whell"=>"",
        "bodyColor"=>"blue"
    ];
    //新增发动机零部件
    public function addEngine($engine){
        $this->motor["engine"] = $engine;
    }
    public function addBody($body){
        $this->motor["body"] = $body;
    }
    public function addWhell($whell){
        $this->motor["whell"] = $whell;
    }
    public function setBodyColor(string $color){
        $this->motor["bodyColor"] = $color;
    }
    //获取完整摩托对象
    public function getMotor(){
        return $this->motor;
    }
}
/**
 * 踏板摩托组装  Adapter 适配器类
 */
class motorcycleScooter
{
    protected $motor;
    public function __construct()
    {
        $this->motor = new MotocycleProduct();
    }
    public function addEngine()
    {
        $this->motor->addEngine("踏板摩托-发动机已装好");
    }
    public function addBody(){
        $this->motor->addBody("踏板摩托-车身已装好");
    }
    public function addWhell(){
        $this->motor->addWhell("踏板摩托-车轮已装好");
    }
    public function setBodyColor($color){
        $this->motor->setBodyColor($color);
    }
    public function getMotor(){
        return $this->motor;
    }
}
/**
 * motorcycleScooterAdapter Adaptee 适配者类
 */
class motorcycleScooterAdapter extends motorcycleScooter implements MotorcycleProduce{
    public function addBodyAndSetColor($color){
        $this->addBody();
        $this->setBodyColor("green");
    }
}
$motorcycleScooter = new motorcycleScooterAdapter;
$motorcycleScooter->addEngine();
$motorcycleScooter->addBody();
$motorcycleScooter->addWhell();
$motorcycleScooter->setBodyColor("red");
$motor = $motorcycleScooter->getMotor();
var_dump($motor);
echo "<br>";
$motorcycleScooter = new motorcycleScooterAdapter;
$motorcycleScooter->addEngine();
$motorcycleScooter->addBodyAndSetColor("green");
$motorcycleScooter->addWhell();
$motor = $motorcycleScooter->getMotor();
var_dump($motor);

对象结构型模式

<?php 
namespace AdapterObj;
//抽象类-定义生产摩托车流水线标准  Target 目标类
interface  MotorcycleProduce 
{
    //发动机方法
    public function addEngine();
    //车身方法
    public function addBody();
    //组装车身并设置颜色
    public function addBodyAndSetColor(string $color);
    //车轮方法
    public function addWhell();
    //喷漆方法
    public function setBodyColor(string $color);
    //获取摩托
    public function getMotor();
}
//摩托车产品本身
class MotocycleProduct{
    private $motor = [
        "engine"=>"",
        "body"=>"",
        "whell"=>"",
        "bodyColor"=>"blue"
    ];
    //新增发动机零部件
    public function addEngine($engine){
        $this->motor["engine"] = $engine;
    }
    public function addBody($body){
        $this->motor["body"] = $body;
    }
    public function addWhell($whell){
        $this->motor["whell"] = $whell;
    }
    public function setBodyColor(string $color){
        $this->motor["bodyColor"] = $color;
    }
    //获取完整摩托对象
    public function getMotor(){
        return $this->motor;
    }
}
/**
 * 踏板摩托组装  Adapter 适配器类
 */
class motorcycleScooter
{
    protected $motor;
    public function __construct()
    {
        $this->motor = new MotocycleProduct();
    }
    public function addEngine()
    {
        $this->motor->addEngine("踏板摩托-发动机已装好");
    }
    public function addBody(){
        $this->motor->addBody("踏板摩托-车身已装好");
    }
    public function addWhell(){
        $this->motor->addWhell("踏板摩托-车轮已装好");
    }
    public function setBodyColor($color){
        $this->motor->setBodyColor($color);
    }
    public function getMotor(){
        return $this->motor;
    }
}
/**
 * motorcycleScooterAdapter Adaptee 适配者类
 */
class motorcycleScooterAdapter implements MotorcycleProduce{
    private $motorcycleScooter;
    public function __construct($motorcycleScooter){
        $this->motorcycleScooter = $motorcycleScooter;
    }
    public function addBodyAndSetColor($color){
        $this->motorcycleScooter->addBody();
        $this->motorcycleScooter->setBodyColor($color);
    }
    public function addBody(){
        $this->motorcycleScooter->addBody();
    }
    public function addEngine(){
        $this->motorcycleScooter->addEngine();
    }
    public function addWhell(){
        $this->motorcycleScooter->addWhell();
    }
    public function setBodyColor(string $color){
        $this->motorcycleScooter->setBodyColor($color);
    }
    public function getMotor(){
        return $this->motorcycleScooter->getMotor();
    }
}
$motorcycleScooter = new motorcycleScooterAdapter(new motorcycleScooter);
$motorcycleScooter->addEngine();
$motorcycleScooter->addBody();
$motorcycleScooter->addWhell();
$motorcycleScooter->setBodyColor("red");
$motor = $motorcycleScooter->getMotor();
var_dump($motor);
echo "<br>";
$motorcycleScooter = new motorcycleScooterAdapter(new motorcycleScooter);
$motorcycleScooter->addEngine();
$motorcycleScooter->addBodyAndSetColor("green");
$motorcycleScooter->addWhell();
$motor = $motorcycleScooter->getMotor();
var_dump($motor);

模式分析

适配器模式(Adapter)通常适用于以下场景。

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

优缺点

适配器模式的优点:

  • 将目标类和适配器者类解耦,通过引入一个适配器类在不修改源代码来重用现有的适配者类
  • 适配者模式增加系统的透明性和复用性,将具体的实现封装在适配者类中,提高了适配者的复用性。
  • 可以在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。
  • 同一个适配器可以把适配者类和它的子类都适配到目标接口。

适配器模式的缺点:

  • 对于Java、C#、PHP等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

适用环境

在以下情况下可以使用适配器模式:

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要。
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
关注微信公众号(yuantanphp)
回复关键字 设计模式 可获取以下材料
《设计模式:可复用面向对象软件的基础》pdf版.
php设计模式23种实例实现php源码
在这里插入图片描述
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯伪猿

觉得文章不错?打赏支持一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值