java 开发模式之二十 :中介者模式

来源:互联网 发布:2016网络伤感歌曲大全 编辑:程序博客网 时间:2024/06/10 09:57

原理或定義

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

结构

Mediator:中介者接口。在里面定义了各个同事之间相互交互所需要的方法,可以是公共的方法,如Change方法,也可以是小范围的交互方法。

ConcreteMediator:具体的中介者实现对象。它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。

Colleague:同事类的定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如,每个具体同事类都应该知道中介者对象,也就是每个同事对象都会持有中介者对象的引用,这个功能可定义在这个类中。

ConcreteColleague:具体的同事类,实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互

類圖

案例与代码

本文使用智慧房屋项目作为示例

描述:早上8点或设定的时间,家里的设备会自动开始按顺序工作。

智慧房屋公司的产品:
闹钟、咖啡机、电视机、窗帘等


中介者模式的设计方案:


Colleague:

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);}

ConcreteColleague

public class Alarm extends Colleague {public Alarm(Mediator mediator, String name) {super(mediator, name);// TODO Auto-generated constructor stubmediator.Register(name, this);}public void SendAlarm(int stateChange) {SendMessage(stateChange);}@Overridepublic void SendMessage(int stateChange) {// TODO Auto-generated method stubthis.GetMediator().GetMessage(stateChange, this.name);}}
public class CoffeeMachine extends Colleague {public CoffeeMachine(Mediator mediator, String name) {super(mediator, name);// TODO Auto-generated constructor stubmediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {// TODO Auto-generated method stubthis.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);}}
public class Curtains extends Colleague {public Curtains(Mediator mediator, String name) {super(mediator, name);// TODO Auto-generated constructor stubmediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {// TODO Auto-generated method stubthis.GetMediator().GetMessage(stateChange, this.name);}public void UpCurtains() {System.out.println("I am holding Up Curtains!");}}
public class TV extends Colleague {public TV(Mediator mediator, String name) {super(mediator, name);// TODO Auto-generated constructor stubmediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {// TODO Auto-generated method stubthis.GetMediator().GetMessage(stateChange, this.name);}public void StartTv() {// TODO Auto-generated method stubSystem.out.println("It's time to StartTv!");}public void StopTv() {// TODO Auto-generated method stubSystem.out.println("StopTv!");}}

Mediator

public interface Mediator {public abstract void Register(String colleagueName, Colleague colleague);public abstract void GetMessage(int stateChange, String colleagueName);public abstract void SendMessage();}

ConcreteColleague

public class ConcreteMediator implements Mediator {private HashMap<String, Colleague> colleagueMap;private HashMap<String, String> interMap;public ConcreteMediator() {colleagueMap = new HashMap<String, Colleague>();interMap = new HashMap<String, String>();}@Overridepublic void Register(String colleagueName, Colleague colleague) {// TODO Auto-generated method stubcolleagueMap.put(colleagueName, colleague);// TODO Auto-generated method stubif (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);}}@Overridepublic void GetMessage(int stateChange, String colleagueName) {// TODO Auto-generated method stubif (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) {} else if (colleagueMap.get(colleagueName) instanceof Curtains) {}}@Overridepublic void SendMessage() {// TODO Auto-generated method stub}}

管理/ 测试类:

public class MainTest {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();Alarm mAlarm = new Alarm(mediator, "mAlarm");CoffeeMachine mCoffeeMachine = new CoffeeMachine(mediator,"mCoffeeMachine");Curtains mCurtains = new Curtains(mediator, "mCurtains");TV mTV = new TV(mediator, "mTV");mAlarm.SendAlarm(0);mCoffeeMachine.FinishCoffee();mAlarm.SendAlarm(1);}}

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


使用場景

1. 一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式
2. 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系结构混乱而且难以复用该对象。

3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

優缺點

主要优点有:

1. 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。

2.可以将对象间一对多的关联转变为一对一,使对象间的关系易于理解和维护。

3.可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用

缺点主要有

中介者模式的缺点是显而易见的,因为这个中介承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响

如果设计不当,中介者对象本身变得过于复杂

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 姓程男孩名字大全 姓王男孩取什么名字 龙姓男孩 给姓许的男孩取名 姓杨男孩 姓的女孩名字 姓陈男孩名字大全 姓陈男孩起名字大全 姓冯女孩气质高贵名字 姓徐女孩 姓丁的名人 丁姓家谱全部字辈 姓丁的男孩名字分数高 丁姓男孩名字 丁姓女孩起名100分 丁姓宝宝起名 丁姓辈分大全 给姓丁的男孩取名 丁姓女孩取名 姓丁的男孩名字 丁姓女孩起名带寓意 姓丁女孩大气淑女名字 丁姓女孩名字 丁姓女孩起名 我姓丁的专属图片 姓丁的名字 姓丁取名 姓丁的女孩名字 姓丁的女孩名字大全 丁姓男孩名字大全 丁姓取名 姓丁的男孩名字要霸气的 姓丁起名 丁姓女孩高分名字 男孩姓丁取什么名字好 丁姓名字 丁姓女孩名字大全 丁姓男孩起名100分 坐不改姓 李衲怎么不姓毛 日本人为何不杀吴姓人