PHP 设计模式 - 继承与适配器模式?

标签 php inheritance design-patterns adapter extends

我对适配器模式的概念有点困惑。我发现适配器类与我通常编写的扩展类非常相似。那么,它们之间的区别实际上是什么?

例如(此 link 中的示例),

SimpleBook.php,

class SimpleBook {


    private $author;
    private $title;


    function __construct($author_in, $title_in) {
      $this->author = $author_in;
      $this->title  = $title_in;
    }


    function getAuthor() {return $this->author;}


    function getTitle() {return $this->title;}


  }

BookAdapter.php

include_once('SimpleBook.php');

  class BookAdapter {


    private $book;


    function __construct(SimpleBook $book_in) {
      $this->book = $book_in;
    }


    function getAuthorAndTitle() {
      return $this->book->getTitle() . ' by ' . $this->book->getAuthor();
    }


  }

BookExtension.php,

include_once('SimpleBook.php');

      class BookExtension extends SimpleBook{

        function getAuthorAndTitle() {
          return $this->getTitle() . ' by ' . $this->getAuthor();
        }


      }

第二种解决方案似乎简单得多。那么它(以及一般的其他继承类)是否被视为适配器类呢?

最佳答案

差异与类如何与多态性一起使用有关。

如果您使用继承,则任何需要 SimpleBook 的函数也将接受 BookExtension 或扩展 SimpleBook 的任何其他类。例如,如果您有:

function PigLatinTitle(SimpleBook $b) {
    return PigLatin($b->getTitle());
}

您可以在 BookExtension 上调用此函数,因为它继承了 SimpleBook::getTitle() 方法。

请注意,反之则不行:需要 BookExtension 的函数无法与 SimpleBook 一起使用。例如,如果函数调用 getAuthorAndTitle(),并且参数是 SimpleBook,则调用将会失败,因为那里没有这样的方法。

如果使用适配器,这两个类是独立的。需要 SimpleBook 的函数将不接受 BookAdapter,反之亦然。您无法在 BookAdapter 上调用 PigLatinTitle(),因为没有 BookAdapter::getTitle() 方法。

您可以通过向 BookAdapter 添加 __call() 魔术方法,然后在 $this- 上重新调用该方法,使适配器像继承一样工作。 >书:

public function __call($name, $arguments) {
    return call_user_func_array(array($this->book, $name), $arguments);
}

关于PHP 设计模式 - 继承与适配器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27614438/

相关文章:

C++ 模板继承。子类应该用固定类型替换基类中的类型

c++ - c++中数据多模型分析的设计模式

design-patterns - 在游戏开发中处理状态和状态变化的好技术是什么?

PHP 初学者 : Best practice for inserting into multiple tables with foreign key

php - 搜索表单 url 结构

php - 在 Android 应用程序中从 Mysql 加载照片

java - Facade 模式的最佳实践是什么?

php - 如何将纯文本输出转换为html标签

python - 子类中 __slots__ 的继承实际上是如何工作的?

c# - C# 3 中具有接口(interface)继承(co(ntra)-variance?)的泛型类型推断