Файл: Описывает их следующим образом.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 36

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


$computer = new ComputerFacade(new Computer());

$computer->turnOn(); // Ай! Бип-бип! Загрузка.. Готов к использованию!

$computer->turnOff(); // Буп-буп-буп-бззз! Аах! Zzzzz

Примеры на Java и Python.

Приспособленец (Flyweight)

Википедия гласит:

Приспособленец — структурный шаблон проектирования, при котором объект, представляющий себя как уникальный экземпляр в разных местах программы, по факту не является таковым.

Пример из жизни: Вы когда-нибудь заказывали чай в уличном ларьке? Там зачастуют готовят не одну чашку, которую вы заказали, а гораздо большую емкость. Это делается для того, чтобы экономить ресурсы (газ/электричество). Газ/электричество в этом примере и являются приспособленцами, ресурсы которых делятся (sharing).

Простыми словами: Приспособленец используется для минимизации использования памяти или вычислительной стоимости путем разделения ресурсов с наибольшим количеством похожих объектов.

Перейдем к примерам в коде. Возьмем наш пример с чаем. Изначально у нас есть различные виды Tea и TeaMaker:

// Все, что будет закешировано, является приспособленцем.

// Типы чая здесь будут приспособленцами.

class KarakTea

{

}
//Ведет себя как фабрика и сохраняет чай

class TeaMaker

{

protected $availableTea = [];
public function make($preference)

{

if (empty($this->availableTea[$preference])) {

$this->availableTea[$preference] = new KarakTea();

}
return $this->availableTea[$preference];

}

}

Теперь у нас есть TeaShop, который принимает заказы и выполняет их:

class TeaShop

{

protected $orders;

protected $teaMaker;
public function __construct(TeaMaker $teaMaker)

{

$this->teaMaker = $teaMaker;

}
public function takeOrder(string $teaType, int $table)

{

$this->orders[$table] = $this->teaMaker->make($teaType);

}
public function serve()

{

foreach ($this->orders as $table => $tea) {

echo "Serving tea to table# " . $table;

}

}

}

Пример использования:

$teaMaker = new TeaMaker();

$shop = new TeaShop($teaMaker);
$shop->takeOrder('меньше сахара', 1);

$shop->takeOrder('больше молока', 2);

$shop->takeOrder('без сахара', 5);
$shop->serve();

// Подаем чай на первый стол

// Подаем чай на второй стол

// Подаем чай на пятый стол

Примеры на Java и Python.

Заместитель (Proxy)

Википедия гласит:

Заместитель — структурный шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера).

Пример из жизни: Вы когда-нибудь использовали карту доступа, чтобы пройти через дверь? Есть несколько способов открыть дверь: например, она может быть открыта при помощи карты доступа или нажатия кнопки, которая обходит защиту. Основная функциональность двери — это открытие, но заместитель, добавленный поверх этого, добавляет функциональность. Но лучше я объясню это на примере кода чуть ниже.


Простыми словами: Используя шаблон заместитель, класс отображает функциональность другого класса.

Перейдем к коду. Возьмем наш пример с безопасностью. Сначала у нас есть интерфейс Door и его реализация:

interface Door

{

public function open();

public function close();

}
class LabDoor implements Door

{

public function open()

{

echo "Открытие дверь лаборатории";

}
public function close()

{

echo "Закрытие двери лаборатории";

}

}

Затем у нас есть заместитель Security для защиты любых наших дверей:

class Security

{

protected $door;
public function __construct(Door $door)

{

$this->door = $door;

}
public function open($password)

{

if ($this->authenticate($password)) {

$this->door->open();

} else {

echo "Нет! Это невозможно.";

}

}
public function authenticate($password)

{

return $password === '$ecr@t';

}
public function close()

{

$this->door->close();

}

}

Пример использования:

$door = new Security(new LabDoor());

$door->open('invalid'); // Нет! Это невозможно.
$door->open('$ecr@t'); // Открытие двери лаборатории

$door->close(); // Закрытие двери лаборатории

Другим примером будет реализация маппинга данных. Например, недавно я создал ODM (Object Data Mapper) для MongoDB, используя этот шаблон, где я написал заместитель вокруг классов mongo и использовал магический метод __call(). Все вызовы методов были замещены оригинальным классом mongo, и полученный результат возвращался без изменений, но в случае find или findOne данные сопоставлялись необходимому классу, и возвращались в объект вместо Cursor.