Посередник

Аналогія

Коли ви розмовляєте з кимось по мобільному, то між вами та співрозмовником знаходиться мобільний оператор. Тобто сигнал передається через нього, а не безпосередньо. У цьому прикладі оператор — посередник.

Стисло

Шаблон «Посередник» має на увазі додавання стороннього об'єкта («посередника») для керування взаємодією між двома об'єктами («колегами»). Шаблон допомагає зменшити пов'язаність (coupling) класів, які спілкуються один з одним, адже тепер вони не повинні знати про реалізацію своїх співрозмовників.

Вікіпедія

Шаблон визначає об'єкт, що інкапсулює спосіб взаємодії набору об'єктів.

Приклад

Найпростіший приклад: чат («посередник»), у якому користувачі («колеги») надсилають одне одному повідомлення.

Створимо «посередника»:

interface ChatRoomMediator
{
    public function showMessage(User $user, string $message);
}

// Посередник
class ChatRoom implements ChatRoomMediator
{
    public function showMessage(User $user, string $message)
    {
        $time = date('M d, y H:i');
        $sender = $user->getName();

        echo $time. '['. $ sender . ']:'. $ Message;
    }
}

Тепер створимо «колег»:

class User {
    protected $name;
    protected $chatMediator;

    public function __construct(string $name, ChatRoomMediator $chatMediator) {
        $this->name = $name;
        $this->chatMediator = $chatMediator;
    }

    public function getName() {
        return $this->name;
    }

    public function send($message) {
        $this->chatMediator->showMessage($this, $message);
    }
}

Використання:

$mediator = новий ChatRoom();

$john = new User('John Doe', $mediator);
$jane = new User('Jane Doe', $mediator);

$john->send('Hi there!');
$jane->send('Hey!');

// Вихідний вигляд
// Feb 14, 10:58 [John]: Hi there!
// Feb 14, 10:58 [Jane]: Hey!