当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 图解Java设计模式之中介者模式

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

2020年04月03日  | 移动技术网IT编程  | 我要评论

智能家庭项目

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

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

在这里插入图片描述
1)当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂。
2)各个电器对象彼此联系,你中有我,我中有你,不利于松耦合。
3)各个电器对象之间所传递的消息(参数),容易混乱
4)当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想。

中介者模式基本介绍

1)中介者模式(mediator pattern),用一个中介对象来封装一系列的对象交互。
中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2)中介者模式属于行为型模式,使代码易于维护。
3)比如mvc模式,c(controller控制器)是m(model模型)和v(view视图)的中介者,在前后端交互时起到来中间人的作用。

中介者模式的原理类图

在这里插入图片描述
对原理类图的说明 :
1)mediator 就是抽象中介者,定义类同事对象到中介者对象的接口。
2)colleague 是抽象同事类。
3)concretemediator 具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类,即以一个集合来管理hashmap,并接收某个同事对象消息,完成相应的任务。
4)concretecolleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都是依赖中介者对象。

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

在这里插入图片描述

  1. 创建concremediator 对象
  2. 创建各个同事类对象,比如 :alarm、coffeemachine、tv
  3. 在创建同事类对象的时候,就直接通过构造器,加入到colleaguemap
  4. 同事类对象,可以调用sendmessage,最终会去调用concretemediator的getmessage方法
  5. getmessage 会根据接收到的同事对象发出的消息来协调调用其他的同事对象,完成任务
  6. 可以看到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<string, colleague> colleaguemap; 
	private hashmap<string, string> intermap;

	public concretemediator() {
		colleaguemap = new hashmap<string, colleague>(); 
		intermap = new hashmap<string, string>();
	}

	@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)如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网