Java设计模式----------中介者模式

1、介绍

中介者模式是将多个对象之间通信的网状结构转化为星状结构,从而避免多个对象之间的相互耦合,是一种行为型的设计模式。中介者模式的思路就是加入一个中介者对象,所有对象与对象之间的通信,均通过中介者来进行,所以每个对象不再依赖其他的对象。

实现:中介者模式中一般存在多个同事类或者对象,中介者类。

  • 同事类或者对象:通常一个对象的状态变化或者行为需要对其他同事产生影响。每个同事对象依赖中介者,通过中介者传达影响。
  • 中介者:被同事类依赖,负责进行同事之间消息的通知。

适用场景:一般存在网状结构的场景,都可以通过中介者模式来进行优化。比如课堂上每个同学的课堂发言或者小组讨论,比如微信的群组的实现等,都是网状的模型。

2、案例

2.1、背景

比如模拟一个班级上同学之间的谈话。班上有三个女生A、B和C,有三个男生D、E和F。女生A想说一些话,只想让女生知道。男生D则想说一些话,让所有的人都可以听到。这是一个很明显的网状通信的问题。

2.2、实现

同事类

public class Student {
    private String name;
    private String sex;

    public Student(String name, String sex) {

        this.name = name;
        this.sex = sex;
        Mediator.add(this);
    }
    public String getSex() {
        return sex;
    }

    public String getName() {

        return name;
    }

    public void sendMessageToAll(String message)
    {
        Mediator.sendMessageToAll(this, message);
    }

    public void sendMessageToSameSex(String message)
    {
        Mediator.sendMessageToSameSex(this, message);
    }

    public void receiveMessage(String message)
    {
        System.out.println(name + "收到了消息。" + message);
    }
}

中介者

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

public class Mediator {
    private static List<Student> maleStudents = new ArrayList<Student>();
    private static List<Student> femaleStudents = new ArrayList<Student>();

    public static void add(Student student)
    {
        if ("male".equals(student.getSex()))
        {
            maleStudents.add(student);
        }
        else
        {
            femaleStudents.add(student);
        }
    }

    public static void sendMessageToAll(Student student, String message)
    {
        for (Student stu : maleStudents)
        {
            if (student.getName().equals(stu.getName()))
                continue;
            stu.receiveMessage(student.getName() + ":" + message);
        }
        for (Student stu : femaleStudents)
        {
            if (student.getName().equals(stu.getName()))
                continue;
            stu.receiveMessage(student.getName() + ":" + message);
        }
    }

    public static void sendMessageToSameSex(Student student, String message)
    {
        List<Student> tempList = "male".equals(student.getSex()) ? maleStudents : femaleStudents;
        for (Student stu : tempList)
        {
            if (student.getName().equals(stu.getName()))
                continue;
            stu.receiveMessage(student.getName() + ":" + message);
        }
    }
}

验证程序

public class Test {
    public static void main(String[] args){
        Student femaleA = new Student("小丽","female");
        Student femaleB = new Student("小红","female");
        Student femaleC = new Student("小美","female");

        Student femaleD = new Student("小刚","male");
        Student femaleE = new Student("小明","male");
        Student femaleF = new Student("小达","male");

        femaleA.sendMessageToAll("大家好,我叫小丽");
        femaleA.sendMessageToSameSex("舍友们,今天咱们去哪里吃饭?");

        femaleD.sendMessageToSameSex("走,去躺厕所。");
    }
}

输出结果

小刚收到了消息。小丽:大家好,我叫小丽
小明收到了消息。小丽:大家好,我叫小丽
小达收到了消息。小丽:大家好,我叫小丽
小红收到了消息。小丽:大家好,我叫小丽
小美收到了消息。小丽:大家好,我叫小丽
小红收到了消息。小丽:舍友们,今天咱们去哪里吃饭?
小美收到了消息。小丽:舍友们,今天咱们去哪里吃饭?
小明收到了消息。小刚:走,去躺厕所。
小达收到了消息。小刚:走,去躺厕所。

3、总结

中介者模式通过加入中介者角色,使得所有对象之间的消息通知都通过中介者进行,从而将网状模型转变为星状模型。

优点:解除同事对象之间的耦合关系

缺点:中介者可能会比较庞大和复杂。

阅读更多
个人分类: 设计模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭