Java中介者设计模式

Java中介者设计模式

定义

中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。

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

对应角色

  • 抽象中介者角色(Mediator):它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者角色(Concrete Mediator):实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  • 同事角色(Colleague):定义各个同事类公有的方法,并声明一些抽象方法来供子类实现公有方法,同时保存一个中介者对象,用于与中介者进行通信。

优缺点

优点

  • 降低了对象之间的耦合性,使得对象易于独立地被复用。
  • 将对象间的一对多关系变成一对一关系,避免了同事类之间的紧密耦合。
  • 减少了子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变了对象间的继承关系,这样同事类就可以不必定义自己的行为,只需实现与中介者协调相关的行为即可。

缺点

  • 中介者会庞大,变得复杂难以维护。
  • 中介者模式将原本分散在多个对象间的行为集中在一起,把原本不容易出错的代码变得复杂难以维护。
  • 中介者模式需要中介者对象的存在,因此系统会新增一个对象,系统复杂性可能会增加。

应用场景

  • 当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可以采用中介者模式,将各个对象间的交互操作分离出来,由中介者来负责。
  • 当对象之间存在很多的关联关系,这些关系导致系统结构复杂且难以理解时,可以采用中介者模式来简化对象之间的关系。
  • 当一个对象引用很多其他对象并直接与这些对象通信,导致难以复用该对象时,可以采用中介者模式,将该对象与其他对象解耦,使其更容易被复用。

实例

import java.util.ArrayList;
import java.util.List;

//抽象中介者
abstract class Mediator {
    public abstract void send(String message, Colleague colleague);
}
//具体中介者
class ConcreteMediator extends Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    public void send(String message, Colleague sender) {
        for (Colleague colleague : colleagues) {
            if (colleague != sender) {
                colleague.receive(message);
            }
        }
    }
}
//抽象同事
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send(String message);

    public abstract void receive(String message);
}
//具体同事
class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.send(message, this);
    }

    public void receive(String message) {
        System.out.println("ConcreteColleague1 received: " + message);
    }
}

class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.send(message, this);
    }

    public void receive(String message) {
        System.out.println("ConcreteColleague2 received: " + message);
    }
}

public class MediatorPatternDemo {

   public static void main(String[] args) {
      ConcreteMediator mediator = new ConcreteMediator();

      ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
      ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

      mediator.register(colleague1);
      mediator.register(colleague2);

      colleague1.send("Hello, World!");
   }
}

你可能感兴趣的:(设计模式系列,java,设计模式)