用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

    【角色】

    • 抽象中介者(Mediator):它是中介者的接口,提供了客户对象注册与转发客户对象信息的抽象方法。
    • 具体中介者(ConcreteMediator):实现中介者接口,定义一个List来管理客户对象,协调各个客户角色之间的交互关系,因此它依赖于客户角色。
    • 抽象客户类(Customer):定义客户类的接口,保存中介者对象,提供客户对象交互的抽象方法。
    • 具体客户类(ConcreteCustomer):是抽象客户类的实现者,当需要与其他客户对象交互时,由中介者对象负责后续的交互。

    【优点】

    • 降低了对象之间的耦合性,使得对象易于独立地被复用。
    • 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

    【缺点】

    • 中介者会膨胀的很大,而且逻辑复杂。

      1. /**
      2. * 中介者
      3. */
      4. public interface Mediator {
      5. /**
      6. * 添加客户
      7. * @param customer
      8. */
      9. void addCustomer(Customer customer);
      10. /**
      11. * 转发消息
      12. * @param message
      13. * @param customer
      14. */
      15. void forward(String message, Customer customer);
      16. }
      1. /**
      2. * 具体中介者
      3. */
      4. public class ConcreteMediator implements Mediator {
      5. private List<Customer> customerList = new ArrayList<>();
      6. /**
      7. * 添加客户
      8. */
      9. @Override
      10. public void addCustomer(Customer customer) {
      11. customerList.add(customer);
      12. }
      13. /**
      14. * 转发消息
      15. */
      16. @Override
      17. public void forward(String message, Customer customer) {
      18. for (Customer c : customerList) {
      19. // 如果是买方发布消息,则通知所有卖方
      20. if (customer instanceof Buyer) {
      21. if (c instanceof Seller) {
      22. c.answer(message);
      23. }
      24. // 如果是卖方发布消息,则通知所有买方
      25. } else {
      26. if (c instanceof Buyer) {
      27. c.answer(message);
      28. }
      29. }
      30. }
      31. }
      32. }
      1. /**
      2. * 客户抽象类
      3. */
      4. public abstract class Customer {
      5. // 客户名称
      6. protected String name;
      7. // 中介
      8. protected Mediator mediator;
      9. public Customer(String name, Mediator mediator) {
      10. this.name = name;
      11. this.mediator = mediator;
      12. }
      13. /**
      14. * 客户的需求
      15. */
      16. public void need(String message) {
      17. System.out.println(name + ": " + message);
      18. // 交给中介转发
      19. mediator.forward(message, this);
      20. }
      21. /**
      22. * 收到回复
      23. */
      24. public abstract void answer(String message);
      25. }
      1. /**
      2. * 买方(买房者)
      3. */
      4. public class Buyer extends Customer {
      5. public Buyer(String name, Mediator mediator) {
      6. super(name, mediator);
      7. }
      8. @Override
      9. public void answer(String message) {
      10. System.out.println("(买方)" + name + "收到消息:" + message);
      11. }
      12. }
      1. /**
      2. * 房东(卖房者)
      3. */
      4. public class Seller extends Customer {
      5. public Seller(String name, Mediator mediator) {
      6. super(name, mediator);
      7. }
      8. @Override
      9. public void answer(String message) {
      10. System.out.println("(房东)" + name + "收到消息:" + message);
      11. }
      12. }

      ```java public class MediatorTest { public static void main(String[] args) {

      1. // 中介者
      2. ConcreteMediator mediator = new ConcreteMediator();
      3. // 买方
      4. Buyer buyer1 = new Buyer("张三", mediator);
      5. Buyer buyer2 = new Buyer("李四", mediator);
      6. // 房东
      7. Seller seller1 = new Seller("老王", mediator);
      8. Seller seller2 = new Seller("老李", mediator);
      9. // 添加客户
      10. mediator.addCustomer(buyer1);
      11. mediator.addCustomer(buyer2);
      12. mediator.addCustomer(seller1);
      13. mediator.addCustomer(seller2);
      14. buyer1.need("我想买一个总价200w的房子");
      15. System.out.println();
      16. seller2.need("我打算出售一个三室一厅的房子");

      } } ——输出—— 张三: 我想买一个总价200w的房子 (房东)老王收到消息:我想买一个总价200w的房子 (房东)老李收到消息:我想买一个总价200w的房子

    老李: 我打算出售一个三室一厅的房子 (买方)张三收到消息:我打算出售一个三室一厅的房子 (买方)李四收到消息:我打算出售一个三室一厅的房子 ```