中介者模式
核心:如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象”,这时可以引入一个中介者对象,使各个同时对象只跟中介者对象打交道。
本质:解耦多个同事对象之间的交互关系,每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
角色:
1) 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
2) 具体中介者(ConcreteMediator)角色:实现中介者接口,定义了一个List来管理同事对象,协调各个同事角色之间的互交关系
3) 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
4) 具体同事类(ConcreteColleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
package com.offcn.designpattern.mediatorpattern; import java.util.HashMap; import java.util.Map; public class mediatorpatternDemo { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); ConcreteDepartment1 c1= new ConcreteDepartment1(mediator); ConcreteDepartment2 c2 = new ConcreteDepartment2(mediator); c1.selfAction(); c2.outAction(); mediator.command("department1"); } } //抽象中介者 interface Mediator{ //注册 void register(String dname,Department d); //给同事发任务 void command(String dname); } //具体中介者,经理 class ConcreteMediator implements Mediator{ private Mapmap = new HashMap<> (); @Override public void register(String dname, Department d) { map.put(dname,d); } @Override public void command(String dname) { map.get(dname).selfAction();//本部门任务 } } //同事接口 interface Department{ void selfAction();//做本部门任务 void outAction();//向经理发出申请 } //具体同事1 class ConcreteDepartment1 implements Department{ private Mediator m;//持有中介者 public ConcreteDepartment1(Mediator m) { this.m = m; //注册 m.register("department1",this); } @Override public void selfAction() { System.out.println("做自己的研发工作"); } @Override public void outAction() { System.out.println("汇报研发工作进展"); } } //具体同事1 class ConcreteDepartment2 implements Department{ private Mediator m;//持有中介者 public ConcreteDepartment2(Mediator m) { this.m = m; //注册 m.register("department2",this); } @Override public void selfAction() { System.out.println("做自己的会计工作"); } @Override public void outAction() { System.out.println("汇报公司开支情况"); } }
输出:
优点:
1)降低了对象之间的耦合性,使得对象易于独立地被复用。
2)将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点:
当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
实用场景:
1) MVC模式其中的C,控制器就是一个中介者对象,M和V都和他打交道
2) 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
3) 图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象