我对适配器模式的概念有点困惑。我发现适配器类与我通常编写的扩展类非常相似。那么,它们之间的区别实际上是什么?
例如(此 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/