1. Предисловие_ _
Наша жизнь повсюду наполнена «посредниками», например, вам может понадобиться помощь этих посредников при аренде жилья, покупке дома, поиске работы, путешествии и т. д. Отношения между странами на земле чрезвычайно сложны, и это может произойти по разным причинам.Чтобы сформировать союзников или врагов на основе таких интересов, отношения между странами также будут меняться с течением времени и окружающая среда из-за интересов.Крупнейшим посредником на земле является Организация Объединенных Наций, которая в основном используется для поддерживать международный мир и безопасность, решать международные проблемы экономического, социального, культурного и гуманитарного характера. То же самое относится и к процессу разработки программного обеспечения. Между объектами существуют прочные и сложные связи. Если нет такой «организации», как Организация Объединенных Наций, легко возникнут проблемы, такие как:
- (1) Структура системы стала очень сложной , и между объектами существует большое количество связей. Если объект изменяется, связанные с ним объекты также необходимо обрабатывать соответствующим образом.
- (2) Увеличение связей между объектами приводит к снижению возможности повторного использования объектов.
- (3) Масштабируемость системы низкая . Чтобы добавить новый объект, нам необходимо добавить ссылки на связанные с ним объекты. Это увеличит связанность системы и уменьшит гибкость и масштабируемость системы.
Если двум классам не нужно взаимодействовать друг с другом, то эти два класса не должны быть напрямую связаны.Если одному классу необходимо вызвать метод в другом классе, мы можем перенаправить вызов через третью сторону. Следовательно, для систем с более сложными связями, чтобы уменьшить корреляцию между объектами и сделать ее слабосвязанной системой, нам необходимо использовать паттерн-посредник.
2. Что такое промежуточная модель?
Шаблон посредника инкапсулирует серию взаимодействий объектов через объекты-посредники, превращая сложную сетевую структуру отношений между объектами в простую звездообразную структуру с посредником в качестве ядра. -одно отношение.Единая ассоциация упрощает отношения между объектами и облегчает понимание;отношения между каждым объектом разъединяются, и каждый объект больше не взаимодействует непосредственно со связанными с ним объектами, а взаимодействует со связанными объектами через промежуточный объект. использоваться относительно независимо, улучшая возможность повторного использования объектов и масштабируемость системы.
В шаблоне посредника класс-посредник лежит в основе. Он инкапсулирует отношения между всеми классами объектов в системе. Помимо упрощения отношений между объектами, он также может дополнительно контролировать взаимодействие между объектами.
3. Структурная диаграмма UML
Mediator: абстрактный посредник, определяет интерфейс между объектами-коллегами и объектами-посредниками.
ConcreteMediator: конкретный посредник, реализует метод абстрактного посредника. Ему необходимо знать все конкретные классы-коллеги и необходимо получать информацию от конкретных классов-коллег. и отправлять информация другим конкретным классам коллег.
Коллега: абстрактный класс коллег.
ConcreteColleague: конкретный класс коллег. Каждому конкретному классу коллег нужно знать только свое собственное поведение, но всем им необходимо знать посредника.
Из структурной диаграммы классов UML видно, что в системе промежуточный класс отвечает в основном за два аспекта: передачу и координацию:
- Структурно он играет роль ретранслятора: благодаря инкапсуляции отношений классом-посредником классу объекта больше не требуется явно ссылаться на другие объекты, и он может взаимодействовать с другими классами объектов только через посредника.
- Играет координирующую роль в поведении: благодаря инкапсуляции отношений классом-посредником класс объекта может осуществлять связь с другими объектами через посредника, не зная других объектов. В этом процессе классу объекта не нужно указывать посреднику, что делать.Посредник может координировать действия в соответствии со своей собственной логикой, далее обрабатывать запросы коллег, а также разделять и инкапсулировать поведение отношений между членами коллег.
Однако объект-посредник инкапсулирует отношения между объектами, в результате чего объект-посредник становится больше и сложнее, несет больше обязанностей и его становится сложнее поддерживать.Он должен знать каждый объект и взаимодействие между ними.Подробности, если это возможно. неправильно, вся система пойдет не так.
Наконец, моделью-посредником также относительно легко злоупотребить. Поэтому, когда в системе появляется сложная интерактивная группа отношений «многие-ко-многим», не спешите использовать модель-посредника. Первое, что вам нужно сделать, это поразмышлять о вашей системе. Разумна ли она по дизайну?
4. Реализация кода
В качестве примера возьмем аренду дома: агентство выступает посредником между арендатором и владельцем дома.
Первый — абстрактный посредник: Mediator.java.
public abstract class Mediator {
//申明一个联络方法
public abstract void constact(String message,Person person);
}
Затем есть абстрактный объект-коллега: Person.java.
public class HouseOwner extends Person{
HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @desc 与中介者联系
* @param message
* @return void
*/
public void constact(String message){
mediator.constact(message, this);
}
/**
* @desc 获取信息
* @param message
* @return void
*/
public void getMessage(String message){
System.out.println("房主:" + name +",获得信息:" + message);
}
}
Тенант.java
public class Tenant extends Person{
Tenant(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @desc 与中介者联系
* @param message
* @return void
*/
public void constact(String message){
mediator.constact(message, this);
}
/**
* @desc 获取信息
* @param message
* @return void
*/
public void getMessage(String message){
System.out.println("租房者:" + name +",获得信息:" + message);
}
}
Конкретный объект-посредник: структура-посредник, MediatorStructure.java
public class MediatorStructure extends Mediator{
//首先中介结构必须知道所有房主和租房者的信息
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public void constact(String message, Person person) {
if(person == houseOwner){ //如果是房主,则租房者获得信息
tenant.getMessage(message);
}
else{ //反之则是获得房主信息
houseOwner.getMessage(message);
}
}
}
Клиент: Client.java
public class Client {
public static void main(String[] args) {
//一个房主、一个租房者、一个中介机构
MediatorStructure mediator = new MediatorStructure();
//房主和租房者只需要知道中介机构即可
HouseOwner houseOwner = new HouseOwner("张三", mediator);
Tenant tenant = new Tenant("李四", mediator);
//中介结构要知道房主和租房者
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);
tenant.constact("听说你那里有三室的房主出租.....");
houseOwner.constact("是的!请问你需要租吗?");
}
}
результат операции:
Арендодатель: Чжан Сан, получил информацию: Я слышал, что вы сдаете в аренду дом с тремя спальнями...
Арендатор: Ли Си, получил информацию: Да, вам нужно его арендовать?
Адрес справочной статьи: Поведенческий шаблон проектирования Java: шаблон посредника_Блог Чжана Вейпэна-CSDN Blog_java Mediator Pattern