中介者模式Mediator

场景:公司中各个部门需要交互,通过中介总经理进行交互

核心:

如果一个系统中对象之间的联系成网状结构,对象之间多对多,将导致关系极其复杂,这些对象统称为“同事关系”

我们可以引入一个中介者对象,使各个同事对象只和自身与中介者打交道,中介再去其他部门交互

中介者模式的本质:

解耦多个同事对象之间的交互关系,每个对象中都持有中介者

开发中常见场景:

-MVC模式(其中的C,控制器就是一个中介者对象。M和V都和它打交道)

-窗口游戏程序,窗口软件开发中窗口也是一个中介者

-GUI中,多个组件之间的交互

-Java.lang.reflect.Method#invoke()

与代理模式的不同理解:代理模式是客户端的中介,中介者模式是同事之间的中介

例子:各个部门和总经理

/**
 * 中介者接口
 * @author 小帆敲代码
 *
 */
public interface Mediator {
  void register(String dname,Department d);
  void command(String dname);
}
/**
 * 具体中介者(总经理)
 * @author 小帆敲代码
 *
 */
class President implements Mediator{
 //同事集合
  private Map<String,Department> map=new HashMap<>();
  
 @Override
 public void register(String dname, Department d) {
  map.put(dname, d);
 }
 //对其他部门的交互
 @Override
 public void command(String dname) {
   map.get(dname).selfAction();
 }
 
}
/**
 * 同事关系接口
 * @author 小帆敲代码
 *
 */
public interface Department {
  void selfAction();//自己部门的活动
  void outAction(String dname);//与别的部门的交互
}
/**
 * 具体同事类(部门)
 * @author 小帆敲代码
 *
 */
class Development implements Department{
  private Mediator m;
 public Development(Mediator m) {
   this.m = m;
   m.register("development", this);
  }
 @Override
 public void selfAction() {
  System.out.println("专心科研,开发项目!");
 }
 @Override
 public void outAction(String dname) {
  m.command(dname);
 }
}
class Market implements Department{
 private Mediator m;
public Market(Mediator m) {
  this.m = m;
  m.register("market", this);
 }
@Override
public void selfAction() {
 System.out.println("市场调研,接项目!");
}
@Override
public void outAction(String dname) {
 m.command(dname);
}
}
class Finicial implements Department{
 private Mediator m;
public Finicial(Mediator m) {
  this.m = m;
  m.register("finicial", this);
 }
@Override
public void selfAction() {
 System.out.println("发钱!");
}
@Override
public void outAction(String dname) {
 m.command(dname);
}
}
/**
 * 客户端
 * @author 小帆敲代码
 *
 */
public class Client {
public static void main(String[] args) {
  Mediator m=new President();
  Development devp=new Development(m);
  Market market=new Market(m);
  Finicial finicial=new Finicial(m);
  
  devp.selfAction();
  devp.outAction("finicial");
}
}

设计模式之GOF23中介者模式的更多相关文章

  1. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  2. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

  3. Java设计模式学习记录-中介者模式

    前言 中介者模式听名字就能想到也是一种为了解决耦合度的设计模式,其实中介者模式在结构上与观察者.命令模式十分相像:而应用目的又与结构模式“门面模式”有些相似.但区别于命令模式的是大多数中介者角色对于客 ...

  4. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

  5. java设计模式-----17、中介者模式

    概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...

  6. 大话设计模式Python实现-中介者模式

    中介者模式(Mediator Pattern):用一个对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互. 下面是一个中介者模式的demo ...

  7. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  9. 设计模式学习之中介者模式(Mediator,行为型模式)(18)

    转载地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信 ...

随机推荐

  1. 性能测试-pidstat 问题定位分析

    pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备IO等系统资源的占用情况.pidstat首次运行时显示自系统启动开始的各项统计信息, ...

  2. Matlab学习-(2)

    1. 文件读取 在编写一个matlab项目时候,通常要导入很多不同格式的数据,下面我们来学习不同的导入函数.(1) 保存工作区MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式 ...

  3. 用 Python 获取百度搜索结果链接

    前言 近期有许多项目需要这个功能,由于Python实现起来比较简单就这么做了,代码贴下来觉得好点个赞吧~ 代码 # coding: utf-8 import os import time import ...

  4. socket小计

    socket,是一个实现了双向通信的链接. 将http比喻为轿车,承载数据.传递数据,那么socket,就是轿车的发动机,它轿车动起来.

  5. 十分钟通过一个实际问题,真正教会大家如何解决Bug

    前言 这篇文章从实际问题 -> 问题解决步骤 -> 问题解决思路,帮助大家能够明白如何在程序中发现问题,定位问题,解决问题.并真正理解那些问题解决思路. 首先说说这个实际问题是什么,又是怎 ...

  6. scrapy爬虫实例(1)

    爬虫实例 对象 阳光问政平台 目标 : 主题,时间,内容 爬取思路 预先设置好items import scrapy class SuperspiderItem(scrapy.Item): title ...

  7. 2019-2020-1 20199325《Linux内核原理与分析》第三周作业

    在实验楼当中进行实验3的实践:主要是针对cpu占用分配,使用时间片轮转算法进行分配 在Shell命令当中输入如下代码: $ cd ~/LinuxKernel/linux-3.9.4 $ rm -rf ...

  8. Codeforces Round #635 (Div. 2) 题解

    渭城朝雨浥轻尘,客舍青青柳色新. 劝君更尽一杯酒,西出阳关无故人.--王维 A. Ichihime and Triangle 网址:https://codeforces.com/contest/133 ...

  9. @SessionAttributes 和 @SessionAttribute的区别

    @SessionAttributes 和 @SessionAttribute的区别 Spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttrib ...

  10. 【集群实战】sersync

    1. sersync介绍 sersync功能: 实时同步: sersync组成: sersync==inotify+rsync inotify: 监控某个目录下面"文件/目录"是否 ...