[23种设计模式][行为型]09.中介者模式

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

1.意图:

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

2.适用性:

  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

3.中介者(Mediator)模式的构成:

  1. 抽象中介者(Mediator):定义一个接口用于各个同事对象(Colleague)之间通信
  2. 具体中介者(ConcreteMediator):协调各个同事对象实现协作的行为,掌握并且维护它的各个同事对象的引用
  3. 同事类(Colleague):每一个同事类都引用一个中介者对象,每一个同事对象在需要和其他同事对象通信时,就与它的中介者通信

4.中介者模式UML类图:

Image.png

5.中介者模式UML序列图:

Image.png

6.代码示例:

Image.png

中介者接口:

public interface IChatroom {

    void register(Participant participant);

    void send(String from, String to, String message);
}

具体中介者——聊天室类:

public class Chatroom implements IChatroom {

    private Hashtable participants = new Hashtable();

    @Override
    public void register(Participant participant) {
        if (null == participants.get(participant.name)) {
            participants.put(participant.name, participant);

            participant.setChatroom(this);
        }
    }

    @Override
    public void send(String from, String to, String message) {
        Participant participant = (Participant) participants.get(to);

        if (null != participant) {
            participant.receive(from, message);
        }
    }
}

同事类父类:

public class Participant {

    private Chatroom chatroom;
    public String name;

    public Participant(String name) {
        this.name = name;
    }

    public Chatroom getChatroom() {
        return chatroom;
    }

    public void setChatroom(Chatroom chatroom) {
        this.chatroom = chatroom;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void send(String to, String message) {
        chatroom.send(name, to, message);
    }

    public void receive(String from, String message) {
        System.out.println(from + " to " + this.name + " : " + message);
    }
}

具体同事类:

public class ConcreteParticipantA extends Participant {

    public ConcreteParticipantA(String name) {
        super(name);
    }

    @Override
    public void receive(String from, String message) {
        super.receive(from, message);
        System.out.println("To ConcreteParticipantA:");
    }
}

```java
public class ConcreteParticipantB extends Participant {

    public ConcreteParticipantB(String name) {
        super(name);
    }

    @Override
    public void receive(String from, String message) {
        System.out.println("To ConcreteParticipantB");
        super.receive(from, message);
    }
}

客户端:

public class Client {

    public static void main(String[] args) {
        Chatroom chatroom = new Chatroom();

        Participant zhangsan = new ConcreteParticipantA("zhangsan");
        Participant lisi = new ConcreteParticipantA("lisi");
        Participant wangwu = new ConcreteParticipantB("wangwu");

        chatroom.register(zhangsan);
        chatroom.register(lisi);
        chatroom.register(wangwu);

        zhangsan.send("lisi", "hello 你好");
        lisi.send("wangwu", "world 世界");
        wangwu.send("zhangsan", "hello world");
    }
}