Шаблоны проектирования PHP — наследование против шаблона адаптера?

Я немного запутался с концепцией шаблона адаптера. Я считаю, что классы адаптера очень похожи на расширенные классы, которые я обычно пишу. Итак, что такое различия между ними на самом деле?

Например (пример из этого ссылка на сайт),

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();
}}

Второе решение кажется намного проще. Так ли это (и Другой классы наследования в целом) рассматриваются как адаптер класс тогда?

0

Решение

Вы можете прочитать этот интересный вопрос об адаптере. Скорее всего, это шаблон оболочки с внутренним и внешним классом:Чем отличаются шаблоны Proxy, Decorator, Adapter и Bridge?.

1

Другие решения

Разница связана с тем, как классы могут быть использованы с полиморфизмом.

Если вы используете наследование, любая функция, которая ожидает SimpleBook также примет BookExtensionили любой другой класс, который расширяет SimpleBook, Например, если у вас было:

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

Вы можете вызвать эту функцию на BookExtension потому что он наследует SimpleBook::getTitle() метод.

Обратите внимание, что это не работает наоборот: функция, которая ожидает BookExtension не будет работать с SimpleBook, Например, если функция вызывает getAuthorAndTitle(), что потерпит неудачу, если аргумент SimpleBook потому что там нет такого метода.

Если вы используете адаптер, два класса независимы. Функции, которые ожидают SimpleBook не примет BookAdapter, и наоборот. Вы не могли позвонить PigLatinTitle() на BookAdapterпотому что нет BookAdapter::getTitle() метод.

Вы можете заставить адаптер работать как наследование, добавив __call() волшебный метод BookAdapter, а затем повторно вызвать метод на $this->book:

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

По вопросам рекламы [email protected]