Автор оригинала: Pankaj Kumar.
Шаблон проектирования медиатора является одним из поведенческих шаблонов проектирования, поэтому он имеет дело с поведением объектов. Шаблон проектирования посредника используется для обеспечения централизованной среды связи между различными объектами в системе.
Шаблон Дизайна Посредника
Согласно GoF, намерение посредника-это:
Шаблон проектирования посредника очень полезен в корпоративном приложении, где несколько объектов взаимодействуют друг с другом. Если объекты взаимодействуют друг с другом напрямую, компоненты системы тесно связаны друг с другом, что повышает стоимость обслуживания и не затрудняет расширение. Шаблон посредника фокусируется на предоставлении посредника между объектами для связи и помощи в реализации свободной связи между объектами.
Диспетчер воздушного движения является отличным примером посреднической модели, когда диспетчерская аэропорта работает в качестве посредника для связи между различными рейсами. Посредник работает как маршрутизатор между объектами и может иметь свою собственную логику для обеспечения способа связи.
Системные объекты, которые взаимодействуют друг с другом, называются коллегами. Обычно у нас есть интерфейс или абстрактный класс, который обеспечивает контракт на связь, а затем у нас есть конкретная реализация посредников.
В нашем примере мы попытаемся реализовать приложение для чата, в котором пользователи могут вести групповой чат. Каждый пользователь будет идентифицирован по своему имени, и они смогут отправлять и получать сообщения. Сообщение, отправленное любым пользователем, должно быть получено всеми другими пользователями в группе.
Интерфейс шаблона посредника
Прежде всего, мы создадим интерфейс посредника, который определит контракт для конкретных посредников.
Прежде всего, мы создадим интерфейс посредника, который определит контракт для конкретных посредников.
package com.journaldev.design.mediator; public interface ChatMediator { public void sendMessage(String msg, User user); void addUser(User user); }
Интерфейс Коллег по шаблону посредника
Пользователи могут отправлять и получать сообщения, поэтому у нас может быть пользовательский интерфейс или абстрактный класс. Я создаю пользователя как абстрактный класс, как показано ниже.
Пользователи могут отправлять и получать сообщения, поэтому у нас может быть пользовательский интерфейс или абстрактный класс. Я создаю пользователя как абстрактный класс, как показано ниже.
package com.journaldev.design.mediator; public abstract class User { protected ChatMediator mediator; protected String name; public User(ChatMediator med, String name){ this.mediator=med; this.name=name; } public abstract void send(String msg); public abstract void receive(String msg); }
Обратите внимание, что у пользователя есть ссылка на объект-посредник, она необходима для связи между разными пользователями.
Конкретный Посредник
Теперь мы создадим класс concretemediator, в нем будет список пользователей в группе и логика взаимодействия между пользователями.
Теперь мы создадим класс concretemediator, в нем будет список пользователей в группе и логика взаимодействия между пользователями.
package com.journaldev.design.mediator; import java.util.ArrayList; import java.util.List; public class ChatMediatorImpl implements ChatMediator { private Listusers; public ChatMediatorImpl(){ this.users=new ArrayList<>(); } @Override public void addUser(User user){ this.users.add(user); } @Override public void sendMessage(String msg, User user) { for(User u : this.users){ //message should not be received by the user sending it if(u != user){ u.receive(msg); } } } }
Образец Дизайна Посредника Конкретный Коллега
Теперь мы можем создавать конкретные классы пользователей, которые будут использоваться клиентской системой.
Теперь мы можем создавать конкретные классы пользователей, которые будут использоваться клиентской системой.
package com.journaldev.design.mediator; public class UserImpl extends User { public UserImpl(ChatMediator med, String name) { super(med, name); } @Override public void send(String msg){ System.out.println(this.name+": Sending Message="+msg); mediator.sendMessage(msg, this); } @Override public void receive(String msg) { System.out.println(this.name+": Received Message:"+msg); } }
Обратите внимание, что метод send() использует посредника для отправки сообщения пользователям, и он понятия не имеет, как оно будет обработано посредником.
Пример Шаблона посредника Код Клиентской программы
Давайте протестируем это наше приложение для чата с помощью простой программы, в которой мы создадим посредника и добавим пользователей в группу, и один из пользователей отправит сообщение.
Давайте протестируем это наше приложение для чата с помощью простой программы, в которой мы создадим посредника и добавим пользователей в группу, и один из пользователей отправит сообщение.
package com.journaldev.design.mediator; public class ChatClient { public static void main(String[] args) { ChatMediator mediator = new ChatMediatorImpl(); User user1 = new UserImpl(mediator, "Pankaj"); User user2 = new UserImpl(mediator, "Lisa"); User user3 = new UserImpl(mediator, "Saurabh"); User user4 = new UserImpl(mediator, "David"); mediator.addUser(user1); mediator.addUser(user2); mediator.addUser(user3); mediator.addUser(user4); user1.send("Hi All"); } }
Обратите внимание, что клиентская программа очень проста, и она понятия не имеет, как обрабатывается сообщение и получает ли посредник пользователя или нет.
Вывод программы примера шаблона посредника является:
Pankaj: Sending Message=Hi All Lisa: Received Message:Hi All Saurabh: Received Message:Hi All David: Received Message:Hi All
Диаграмма Классов Шаблона посредника
Пример шаблона посредника в JDK
- java.util.Таймер методы расписания занятий XXX()
- Исполнитель параллелизма Java Метод execute ().
- java.lang.размышляйте.Метод invoke() метод.
Шаблон Дизайна Посредника Важные Моменты
- Шаблон посредника полезен, когда логика связи между объектами сложна, у нас может быть центральная точка связи, которая заботится о логике связи.
- Служба сообщений Java (JMS) использует шаблон посредника вместе с шаблоном наблюдателя , чтобы позволить приложениям подписываться и публиковать данные для других приложений.
- Мы не должны использовать шаблон посредника только для достижения слабой связи, потому что если количество посредников будет расти, то их будет трудно поддерживать.
Это все для шаблона проектирования посредника и его реализации на java.