中介者模式java_图解Java设计模式之中介者模式

智能家庭项目

1)智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等

2)主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为 :闹铃响起 - 》咖啡机开始做咖啡 -》窗帘自动落下 -》电视机开始播放

传统方案解决智能家庭管理问题

fa8992368090afee8a70b1fac7b29ad5.png

1)当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂。

2)各个电器对象彼此联系,你中有我,我中有你,不利于松耦合。

3)各个电器对象之间所传递的消息(参数),容易混乱

4)当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想。

中介者模式基本介绍

1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。

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

2)中介者模式属于行为型模式,使代码易于维护。

3)比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到来中间人的作用。

中介者模式的原理类图

8ecd33aa3c58630fdb8732043ca8397d.png

对原理类图的说明 :

1)Mediator 就是抽象中介者,定义类同事对象到中介者对象的接口。

2)Colleague 是抽象同事类。

3)ConcreteMediator 具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类,即以一个集合来管理HashMap,并接收某个同事对象消息,完成相应的任务。

4)ConcreteColleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都是依赖中介者对象。

中介者模式 - 智能家庭的操作流程

59b7a86ac38de989e28bd4abd7aae082.png

创建ConcreMediator 对象

创建各个同事类对象,比如 :Alarm、CoffeeMachine、TV

在创建同事类对象的时候,就直接通过构造器,加入到colleagueMap

同事类对象,可以调用sendMessage,最终会去调用ConcreteMediator的getMessage方法

getMessage 会根据接收到的同事对象发出的消息来协调调用其他的同事对象,完成任务

可以看到getMessage 是核心方法,完成相应任务

package com.example.demo.mediator;

public abstract class Mediator {

//将给中介者对象,加入到集合中

public abstract void Register(String colleagueName, Colleague colleague);

//接收消息, 具体的同事对象发出

public abstract void GetMessage(int stateChange, String colleagueName);

public abstract void SendMessage();

}

package com.example.demo.mediator;

public abstract class Colleague {

private Mediator mediator;

public String name;

public Colleague(Mediator mediator, String name) {

this.mediator = mediator;

this.name = name;

}

public Mediator GetMediator() {

return this.mediator;

}

public abstract void SendMessage(int stateChange);

}

package com.example.demo.mediator;

public class Alarm extends Colleague {

public Alarm(Mediator mediator, String name) {

super(mediator, name);

// TODO Auto-generated constructor stub

//在创建 Alarm 同事对象时,将自己放入到 ConcreteMediator 对象中[集合]

mediator.Register(name, this);

}

public void SendAlarm(int stateChange) {

SendMessage(stateChange);

}

@Override

public void SendMessage(int stateChange) {

// TODO Auto-generated method stub

//调用的中介者对象的 getMessage

this.GetMediator().GetMessage(stateChange, this.name);

}

}

package com.example.demo.mediator;

public class CoffeeMachine extends Colleague {

public CoffeeMachine(Mediator mediator, String name) {

super(mediator, name);

// TODO Auto-generated constructor stub

mediator.Register(name, this);

}

@Override

public void SendMessage(int stateChange) {

// TODO Auto-generated method stub

this.GetMediator().GetMessage(stateChange, this.name);

}

public void StartCoffee() {

System.out.println("It's time to startcoffee!");

}

public void FinishCoffee() {

System.out.println("After 5 minutes!");

System.out.println("Coffee is ok!");

SendMessage(0);

}

}

package com.example.demo.mediator;

public class Curtains extends Colleague {

public Curtains(Mediator mediator, String name) {

super(mediator, name);

// TODO Auto-generated constructor stub

mediator.Register(name, this);

}

@Override

public void SendMessage(int stateChange) {

// TODO Auto-generated method stub

this.GetMediator().GetMessage(stateChange, this.name);

}

public void UpCurtains() {

System.out.println("I am holding Up Curtains!");

}

}

package com.example.demo.mediator;

public class TV extends Colleague {

public TV(Mediator mediator, String name) {

super(mediator, name);

// TODO Auto-generated constructor stub

mediator.Register(name, this);

}

@Override

public void SendMessage(int stateChange) {

// TODO Auto-generated method stub

this.GetMediator().GetMessage(stateChange, this.name);

}

public void StartTv() {

// TODO Auto-generated method stub

System.out.println("It's time to StartTv!");

}

public void StopTv() {

// TODO Auto-generated method stub

System.out.println("StopTv!");

}

}

package com.example.demo.mediator;

import java.util.HashMap;

public class ConcreteMediator extends Mediator {

//集合,放入所有的同事对象

private HashMap colleagueMap;

private HashMap interMap;

public ConcreteMediator() {

colleagueMap = new HashMap();

interMap = new HashMap();

}

@Override

public void Register(String colleagueName, Colleague colleague) {

colleagueMap.put(colleagueName, colleague);

// TODO Auto-generated method stub

if (colleague instanceof Alarm) {

interMap.put("Alarm", colleagueName);

} else if (colleague instanceof CoffeeMachine) {

interMap.put("CoffeeMachine", colleagueName);

} else if (colleague instanceof TV) {

interMap.put("TV", colleagueName);

} else if (colleague instanceof Curtains) {

interMap.put("Curtains", colleagueName);

}

}

//具体中介者的核心方法

//1. 根据得到消息,完成对应任务

//2. 中介者在这个方法,协调各个具体的同事对象,完成任务

@Override

public void GetMessage(int stateChange, String colleagueName) {

// TODO Auto-generated method stub

//处理闹钟发出的消息

if (colleagueMap.get(colleagueName) instanceof Alarm) {

if (stateChange == 0) {

((CoffeeMachine) (colleagueMap.get(interMap

.get("CoffeeMachine")))).StartCoffee();

((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();

} else if (stateChange == 1) {

((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();

}

else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {

((Curtains) (colleagueMap.get(interMap.get("Curtains")))).UpCurtains();

}

} else if (colleagueMap.get(colleagueName) instanceof TV) {

//如果 TV 发现消息

} else if (colleagueMap.get(colleagueName) instanceof Curtains) {

//如果是以窗帘发出的消息,这里处理...

}

}

@Override

public void SendMessage() {

// TODO Auto-generated method stub

}

}

package com.example.demo.mediator;

import java.util.HashMap;

public class Client {

public static void main(String[] args) {

// TODO Auto-generated method stub

//创建一个中介者对象

Mediator mediator = new ConcreteMediator();

//创建 Alarm 并且加入到 ConcreteMediator 对象的 HashMap

Alarm alarm = new Alarm(mediator, "alarm");

//创建了 CoffeeMachine 对象,并 且加入到 ConcreteMediator 对象的 HashMap

CoffeeMachine coffeeMachine = new CoffeeMachine(mediator,"coffeeMachine");

//创建 Curtains , 并 且加入到 ConcreteMediator 对象的 HashMap

Curtains curtains = new Curtains(mediator, "curtains");

TV tV = new TV(mediator, "TV");

//让闹钟发出消息

alarm.SendAlarm(0);

coffeeMachine.FinishCoffee();

alarm.SendAlarm(1);

}

}

中介者模式的注意事项和细节

1)多个类相互耦合,会形成网站结构,使用中介者模式将网状结构分离为星型结构,进行解耦。

2)减少类间依赖,降低类耦合,符合迪米特法则。

3)中介者承担类较多的责任,一旦中介者出现了问题,整个系统就会受到影响。

4)如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【POJ - 2398】Toy Storage (计算几何,二分找位置,叉积,点和直线的位置关系)

题干: Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box to put his toys in. Unfortunately, Reza is rebellious and obeys his parents by simply throwing …

java servlet 转发和重定向_JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

前言前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别!一、request请求参数出现乱码问题1.1、get请求1)乱码示例get请求的参数是在url后面提交过来的,也就是在请求行中。结果:Servlet_de…

java jsp导出pdf文件_JSP页面导出PDF格式文件

JSP页面导出PDF格式文件基本在前端页面可以全部完成添加下载链接的点击事件var downPdf document.getElementById("downLoad");downPdf.onclick function() {downPdf.parentNode.removeChild(downPdf);html2canvas(document.body, {onrendered:function(canvas) {v…

java unsafe park_Java中Unsafe类详解

http://www.cnblogs.com/mickole/articles/3757278.htmlJava不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中…

【qduoj - 夏季学期创新题】骑士游历(递推dp)

题干: 描述 输入 输入包含多组数据,第一行T表示数据组数接下来每行六个整数n,m,x1,y1,x2,y2(分别表示n,m,起点坐标,终点坐标) 输出 输出T行,表示…

java ee 6 源码_Java EE 6开发手册·高级篇(第4版)

资源名称:Java EE 6开发手册高级篇(第4版)内容简介:《Java EE 6 开发手册?高级篇(第4 版)》是一本面向实战、以示例为驱动、在Java 平台企业版6(Java EE 6)上开发企业级应用的指南。该指南基于The Java EE 6 Tutorial: Basic Concepts,Fourt…

【qduoj - 夏季学期创新题】矩形剖分(递归,dp)

题干: 描述 对一个给定的矩形,将其划分成尽可能少的正方形,输出正方形的最少个数。例如,如下图所示的情况,则输入为3和4,输出为4。 输入 输入两个整数中间用空格分开。 输出 输出最少分割成的正方形的个…

学分绩点计算编程java_方便我们计算学分绩点的JavaScript

基于目前我们学校教务处的管理系统, 依靠Javascript的帮忙, 我们可以很方便地计算成绩.测试用HTML:style"width: 100%; border-collapse: collapse;">课程代码课程名称课程性质成绩补考成绩重修成绩学分绩点辅修标记24109505数据库系统实验专业基础课优秀0.54.502…

【POJ - 2663】Tri Tiling (简单dp)

题干: In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle. Input Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer …

【POJ - 1556】The Doors (计算几何,线段相交)

题干: You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x 0, x 10, y 0, and y 10. The initial and final points of the path are always (0, 5) and (10, 5). Th…

【POJ - 1696】Space Ant (凸包,最小极角,排序)

题干: The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet Y1999 and called it M11. It has only one eye on the left side of its head and just three feet al…

2019蓝桥杯Java决赛题答案_2019第十届蓝桥杯JavaB组省赛真题详解

目录题解待更新第一题:组队题目描述做为篮球队教练,你须要从如下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分以下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大多是多少&am…

java map统计学生名单_Java含自己的总结:集合,学生,遍历,ArrayList,Set,Map,泛型,班级,发牌—诗书画唱...

声明一个ArrayList,存储一条学生信息,内容为 1 张三 22 男,将信息进行遍历出来package list;import java.util.ArrayList;import java.util.Iterator;public class student{public static void main(String[] args) {ArrayList jiHe…

java生成world文件_HelloWorld.java文件如何创建?

原创HelloWorld.java文件如何创建?编辑:小丸子 来源:PC下载网时间:2017-10-17 19:55:54相信各位刚接触JAVA的新人都希望尽快编写出自己的第一个程序,今天PC下载网小编和你一起学习HelloWorld程序1.首先我们先点击“开始”—然后是“所有程序”—在然后是“附件”—记…

wifisetting.java_Wifi 笔记 | 启动流程

csd:csdn_of_coder/article/details/51541094aosp: Android OAndroid网络各个模式中,Wifi应该是目前最常用的一种网络方式了;下面就简单介绍下Android中Wifi的启动流程。当我在Setting菜单里点击打开Wifi时,调用的入口函数是WifiM…

java 调用动态链接库_JAVA技巧:JNative调用动态链接库问题(SOS)

动态链接库的方法如下:__declspec(dllexport) ret __stdcall rLachTran(const char *pc_trancode,const char *pc_clicode,const char *pc_orgcode,const char *pc_ttycode,const int i_brandid,const char *pc_reqstamp,const int i_reqseqno,const char *pc_svrip…

【POJ - 3347 】Kadj Squares (计算几何,思维 或 扫描线)

题干: In this problem, you are given a sequence S1, S2, ..., Sn of squares of different sizes. The sides of the squares are integer numbers. We locate the squares on the positive x-y quarter of the plane, such that their sides make 45 degrees w…

按钮开关java代码,Android自定义实现开关按钮代码

我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子子个人认为还是自定义的比较好,先上个效果图:实现过程:1.准备开关不同状态的两张图片放入drawable中。2.x…

*【CodeForces - 202C 】Clear Symmetry (思维,找规律,特判)

题干: Consider some square matrix A with side n consisting of zeros and ones. There are nrows numbered from 1 to n from top to bottom and n columns numbered from 1 to n from left to right in this matrix. Well denote the element of the matrix wh…

*【CodeForces - 768B】Code For 1 (分治策略,模拟二分思想,模拟线段树思想)

题干: Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On his arrival, Sam tells him that he wants to go to Oldtown to train at the Citadel to become a maester, so he can return and take the decease…