用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
【角色】
- 抽象中介者(Mediator):它是中介者的接口,提供了客户对象注册与转发客户对象信息的抽象方法。
- 具体中介者(ConcreteMediator):实现中介者接口,定义一个List来管理客户对象,协调各个客户角色之间的交互关系,因此它依赖于客户角色。
- 抽象客户类(Customer):定义客户类的接口,保存中介者对象,提供客户对象交互的抽象方法。
- 具体客户类(ConcreteCustomer):是抽象客户类的实现者,当需要与其他客户对象交互时,由中介者对象负责后续的交互。
【优点】
- 降低了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
【缺点】
中介者会膨胀的很大,而且逻辑复杂。
/*** 中介者*/public interface Mediator {/*** 添加客户* @param customer*/void addCustomer(Customer customer);/*** 转发消息* @param message* @param customer*/void forward(String message, Customer customer);}
/*** 具体中介者*/public class ConcreteMediator implements Mediator {private List<Customer> customerList = new ArrayList<>();/*** 添加客户*/@Overridepublic void addCustomer(Customer customer) {customerList.add(customer);}/*** 转发消息*/@Overridepublic void forward(String message, Customer customer) {for (Customer c : customerList) {// 如果是买方发布消息,则通知所有卖方if (customer instanceof Buyer) {if (c instanceof Seller) {c.answer(message);}// 如果是卖方发布消息,则通知所有买方} else {if (c instanceof Buyer) {c.answer(message);}}}}}
/*** 客户抽象类*/public abstract class Customer {// 客户名称protected String name;// 中介protected Mediator mediator;public Customer(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}/*** 客户的需求*/public void need(String message) {System.out.println(name + ": " + message);// 交给中介转发mediator.forward(message, this);}/*** 收到回复*/public abstract void answer(String message);}
/*** 买方(买房者)*/public class Buyer extends Customer {public Buyer(String name, Mediator mediator) {super(name, mediator);}@Overridepublic void answer(String message) {System.out.println("(买方)" + name + "收到消息:" + message);}}
/*** 房东(卖房者)*/public class Seller extends Customer {public Seller(String name, Mediator mediator) {super(name, mediator);}@Overridepublic void answer(String message) {System.out.println("(房东)" + name + "收到消息:" + message);}}
```java public class MediatorTest { public static void main(String[] args) {
// 中介者ConcreteMediator mediator = new ConcreteMediator();// 买方Buyer buyer1 = new Buyer("张三", mediator);Buyer buyer2 = new Buyer("李四", mediator);// 房东Seller seller1 = new Seller("老王", mediator);Seller seller2 = new Seller("老李", mediator);// 添加客户mediator.addCustomer(buyer1);mediator.addCustomer(buyer2);mediator.addCustomer(seller1);mediator.addCustomer(seller2);buyer1.need("我想买一个总价200w的房子");System.out.println();seller2.need("我打算出售一个三室一厅的房子");
} } ——输出—— 张三: 我想买一个总价200w的房子 (房东)老王收到消息:我想买一个总价200w的房子 (房东)老李收到消息:我想买一个总价200w的房子
老李: 我打算出售一个三室一厅的房子 (买方)张三收到消息:我打算出售一个三室一厅的房子 (买方)李四收到消息:我打算出售一个三室一厅的房子 ```
