MENU

《Java设计模式及实践》中介者模式

February 5, 2020 • 《Java设计模式及实践》读书笔记

中介者模式

介绍

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

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

优点:

  1. 降低了类的复杂度,将一对多转化成了一对一。
  2. 各个类之间的解耦。
  3. 符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景:

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

实现

类的组成

  • Mediator(抽象中介者):抽象中介者定义了参与者的交互方式。在此接口或抽象类中声明的操作与场景相关。
  • ConcreteMediator(具体中介者):它实现了中介者声明的操作。
  • Colleague(抽象同事角色):这是一个抽象类或接口,用于定义需要调节的参与者如何进行交互。
  • ConcreteColleague(具体同事角色):这是实现Colleague接口的具体类。

UML图

image-20200205145928808.png

代码

中介者

public interface ChatRoom {
    void showMessage(User user, String message);
}

public class ChatRoomImpl implements ChatRoom {
    public void showMessage(User user, String message){
        System.out.println(new Date().toString()
                + " [" + user.getName() +"] : " + message);
    }
}

同事角色类

public abstract class User {
    protected String name;
    private ChatRoomImpl chatRoom = new ChatRoomImpl();

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

    public abstract String getName();

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

    public void sendMessage(String message){
        chatRoom.showMessage(this,message);
    }
}

public class Admin extends User {
    public Admin(String name) {
        super(name);
    }

    @Override
    public String getName() {
        return "Admin-" + name;
    }
}

public class Client extends User {
    public Client(String name) {
        super(name);
    }

    @Override
    public String getName() {
        return "Client-" + name;
    }
}
public class Main {
    public static void main(String[] args) {
        Client robert = new Client("Robert");
        Client john = new Client("John");
        Admin tom = new Admin("Tom");

        robert.sendMessage("Hi! John!");
        john.sendMessage("Hello! Robert!");
        tom.sendMessage("Welcome!");
    }
}
Github

mediator

Archives QR Code Tip
QR Code for this page
Tipping QR Code