亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Java設計模式(21)----------中介者模式

介绍

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

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

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

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

案例
背景

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

实现

同事类

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("走,去躺厕所。");
    }
}

输出结果

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

总结

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

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

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

點擊查看更多內容
6人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
1萬
獲贊與收藏
1426

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消