欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-03 13:10:00
图解Java设计模式之中介者模式 智能家庭项目 传统方案解决智能家庭管理问题 中介者模式基本介绍 中介者模式的原理类图 中介者模式 - 智能家庭的操作流程 中介者模式的注意事项和细节 智能家庭项目 1)智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等2)主人要看电视时,各个设备可以协同工作,自动完 ......

智能家庭项目

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

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

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

中介者模式基本介绍

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

中介者模式的原理类图

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

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

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

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