适配器模式

未匹配的标注

意图

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式很好理解,我们从生活中的例子来理解就行。

每个插座都提供了基本的功能:插入与充电

<?php

abstract class Socket
{
  abstract public function insert($string);
  public function charge() {
    echo "进行充电";
  }
}

现在有一个三孔的插座

<?php

class ThreeSocket extends Socket
{
  public function insert($string)
  {
    echo "将{$string}插入插座";
  }
}

然而我的手机充电器只能插两孔插座,这样明显是无法充电的

<?php

function client(Socket $socket)
{
    $socket->insert("手机充电器");
      $socket->charge();
}

$socket = new ThreeSocket();
client($socket); // 由于手机充电器无法插入到三孔插座,所以无法充电

不难看出,我们要适配的插入两孔插座这个接口

<?php

class InsertTwoHole
{
    public function insert()
    {
        return "插入两孔插座"'
    }
}

电源适配器的工作就是将手机充电器插入两孔插座这个接口与三孔插座进行适配

<?php

class SocketAdapter extends ThreeSocket
{    
  private $insertTwoHold;

  public function __construct(InsertTwoHole $insertTwoHold)
  {
    $this->insertTwoHold = $insertTwoHold
  }

  public function insert()
  {    
    echo "将三孔转化为两孔";
    $this->insertTwoHold->insert();
  }
} 

有了适配器时候,就可以进行充电了,并且,对于客户端而言,不需要做出任何改动。

<?php

function client(Socket $socket)
{
    $socket->insert("手机充电器");
      $socket->charge();
}

$socket = new SocketAdapter();
client($socket); 

通过该例子,我们可以看出适配器的典型应用场景。因为我们的三孔插座接口不符合我们的充电要求,你又没办法去修改它,只能通过电源适配器来兼容手机充电。而对于一些第三方接口或者历史遗留代码也同样面临这样的问题,你无法直接修改接口,只能采取适配器来兼容接口。

实现

image.png

Target,类似于插座,也就是与我们的客户端(手机充电器)有关的特性领域的相关接口

<?php

class Target
{
    public function request(): string
    {
        return "Target: The default target's behavior.";
    }
}

Adaptee, 一个已存在接口,该接口需要进行适配,即手机充电器插入两孔插座

<?php

class Adaptee
{
    public function specificRequest(): string
    {
        return ".eetpadA eht fo roivaheb laicepS";
    }
}

Adapter,对 Adapee 接口与 Target 接口进行适配

<?php

class Adapter extends Target
{
    private $adaptee;

    public function __construct(Adaptee $adaptee)
    {
        $this->adaptee = $adaptee;
    }

    public function request(): string
    {
        return "Adapter: (TRANSLATED) " . strrev($this->adaptee->specificRequest());
    }
}

总结

适配器实现了开闭原则,在不修改客户端代码的情况下,可以添加新的类型的适配器。

适配器的使用场景:现有的服务接口既无法修改(第三方、历史遗留),又满足不了客户端的接口需求,这时候,我们需要根据客户端的接口需求创建对应的适配器。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 1
发起讨论 只看当前版本


wzg10086
怎么不更新了啊
0 个点赞 | 2 个回复 | 问答