中介者模式的定义:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们的交互。
中介者模式有很广泛的应用,比如在MVC框架中,C就是一个中介者,他来协调V和M的调用,减少View和Model层得交互,在很多优秀的开源框架中都有很好的体现。
Mediator :抽象中介者角色 它定义统一的接口,用户各个同事角色之间的通信
Concrete Mediator :具体中介者角色 它是中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。
Colleague :同事角色 每一个同事角色都必须知道中介者角色,并且在和其他的同事进行通信的时候一定要通过中介者角色,每个同事类的行为分为两种,一种是同事本身的行为,比如改变对象本身的状态。第二种是必须依赖中介者才能完成的行为,叫做依赖方法。
在计算机的世界里有一个很重要的思想,就是中介的思想,比如在两个事物之间之间联系变得很困难的时候就会想到增加一个中间件,中介者模式也是这样,当两者同事联系变得复杂的时候就增加一个中介者。
计算机网络中的早期的集线器不就是这样的吗?一个星型的链接让通信变得简单很多。
员工类
package com.gengu.中介者; /** * 定义通用员工类 * */ public abstract class Staff { /** * 每一个员工是必须要有一个中介者给它服务的 */ protected Mediator mediator; public Staff(Mediator mediator){ this.mediator = mediator; } //自己做自己的事 public abstract void doSomeThing(); //寻求帮助 public abstract void AskForHelp(); //帮助 public abstract void HelpOther(); }
员工A 和员工B
package com.gengu.中介者; public class ColleagueA extends Staff{ public ColleagueA(Mediator mediator) { super(mediator); } //定义一些自己的工作 public void doSomeThing(){ System.out.println("I am working"); } //定义一个依赖方法 public void AskForHelp(){ mediator.BhellpA(); //System.out.println("I am A,I am asking for help"); } //再定义一个方法 public void HelpOther(){ mediator.AhellpB(); } } package com.gengu.中介者; public class ColleagueB extends Staff{ public ColleagueB(Mediator mediator) { super(mediator); } //定义一些自己的工作 public void doSomeThing(){ System.out.println("I am working"); } //定义一个依赖方法 public void AskForHelp(){ super.mediator.AhellpB(); } @Override public void HelpOther() { super.mediator.BhellpA(); } }
抽象中介者
package com.gengu.中介者; /** * 中介者抽象类 * */ public abstract class Mediator { protected ColleagueA staffA = null; protected ColleagueB staffB = null; public ColleagueA getStaffA() { return staffA; } public void setStaffA(ColleagueA staffA) { this.staffA = staffA; } public ColleagueB getStaffB() { return staffB; } public void setStaffB(ColleagueB staffB) { this.staffB = staffB; } public abstract void AhellpB(); public abstract void BhellpA(); }
实体中介者
package com.gengu.中介者; public class ConcreteMediator extends Mediator{ @Override public void AhellpB() { //staffA.HelpOther(); System.out.println("A is helping B"); } @Override public void BhellpA() { System.out.println("B is helping A"); //staffB.HelpOther(); } }
就是把本来他们直接交互的那种关系加一个中介,这样可以让复杂的关系调用变得简单起来。