当前位置: 首页 > news >正文

设计模式(二十三)中介者模式

先看图:

有很多孤立的人这里是3个,如果有100个,是不是图很复杂,那在程序中表示出来就很难。明显用右图很明了。

中介者模式就是简化这种关系的模式,有两个角色:关系成员、中介者。我一般喜欢从语法上分析:

中介者:包含每一个关系成员,要处理所有的关系,就要包含是所有的成员。只有一个方法

abstract class Mediator {
    abstract void call(String string, Person person);
}
复制代码

具体中介者:call是处理关系的,主要的方法。

public class AllMediator extends Mediator {
    Aperson aperson;
    Bperson bperson;
    Cperson cperson;

    

    public Aperson getAperson() {
        return aperson;
    }



    public void setAperson(Aperson aperson) {
        this.aperson = aperson;
    }



    public Bperson getBperson() {
        return bperson;
    }



    public void setBperson(Bperson bperson) {
        this.bperson = bperson;
    }



    public Cperson getCperson() {
        return cperson;
    }



    public void setCperson(Cperson cperson) {
        this.cperson = cperson;
    }



    @Override
    void call(String string, Person person) {
        if (person == aperson) {
            aperson.re(string);
        } else if (person == bperson) {
            bperson.re(string);
        } else if (person == cperson) {
            cperson.re(string);
        }

    }

}
复制代码

成员,不必包含与他有关系的成员,他只需包含一个中介者,通过中介发消息,是委托给中介。他有一个发消息的方法,中介通过判定成员来确定恢复消息。

abstract class Person {
    String name;
    Mediator mediator;

    Person(String name, Mediator mediator) {
        this.mediator = mediator;
        this.name = name;
    }
    abstract void call(String mess);
    abstract void re(String mess);
    
}
复制代码

A:

public class Aperson extends Person {

    Aperson(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    void call(String mess) {
        mediator.call(mess, this);

    }

    @Override
    void re(String mess) {
        System.out.println(name + ":" + mess);

    }

}
复制代码

B:

public class Bperson extends Person {

    Bperson(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    void call(String mess) {
        mediator.call(mess, this);

    }

    @Override
    void re(String mess) {
        System.out.println(name + ":" + mess);

    }

}
复制代码

C:

public class Cperson extends Person {

    Cperson(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    void call(String mess) {
        mediator.call(mess, this);

    }

    @Override
    void re(String mess) {
        System.out.println(name + ":" + mess);

    }

}
复制代码

测试

class Test {

    public static void main(String[] args) {
        AllMediator mediator = new AllMediator();
        Aperson aperson = new Aperson("A同学", mediator);
        Bperson bperson = new Bperson("B同学", mediator);
        Cperson cperson = new Cperson("C同学", mediator);

        mediator.setAperson(aperson);
        mediator.setBperson(bperson);
        mediator.setCperson(cperson);

        aperson.call("告诉B,我明天不去了");
        bperson.call("告诉C,我明天不去了");

    }

}
复制代码

结果:

A同学:告诉B,我明天不去了

B同学:告诉C,我明天不去了

note:只要不放弃,就没有什么能让自己退缩;只要够坚强,就没有什么能把自己打垮!

转载于:https://juejin.im/post/5ce3fe02518825314b6d6084

相关文章:

  • 3.7、@ResponseBody 和 @RestController
  • C 语言 格式化输出输入
  • ls输出显示命令总结
  • 指针
  • 第二周 词频统计
  • java之struts2的action的创建方式
  • linux安装openssl、swoole等扩展的具体步骤
  • CSS 分享
  • VS2017 常用快捷键
  • Vue.js源码(2):初探List Rendering
  • 如何把文字转换成语音,文字转语音转换器能帮你
  • 面试官:你接受免费加班吗?程序员这样怼回去,网友:老铁没毛病
  • fseek的使用
  • assert()函数用法
  • Python Day29
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • crontab执行失败的多种原因
  • CSS盒模型深入
  • ES6核心特性
  • httpie使用详解
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Linux Process Manage
  • Python 反序列化安全问题(二)
  • Spring-boot 启动时碰到的错误
  • Vue ES6 Jade Scss Webpack Gulp
  • vue-router的history模式发布配置
  • windows-nginx-https-本地配置
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 好的网址,关于.net 4.0 ,vs 2010
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 聚簇索引和非聚簇索引
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 一个SAP顾问在美国的这些年
  • 与 ConTeXt MkIV 官方文档的接驳
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #mysql 8.0 踩坑日记
  • #NOIP 2014#Day.2 T3 解方程
  • (12)目标检测_SSD基于pytorch搭建代码
  • (8)STL算法之替换
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (过滤器)Filter和(监听器)listener
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .net 调用php,php 调用.net com组件 --
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net访问oracle数据库性能问题
  • .net分布式压力测试工具(Beetle.DT)
  • .Net中的集合
  • 。Net下Windows服务程序开发疑惑
  • ::before和::after 常见的用法