简介
仲裁者模式
(Mediator Pattern)是一种行为型设计模式
,它允许将复杂的系统划分为一组松耦合
的对象,并通过这些对象的相互作用来实现更大的协作。该模式促进了对象之间的松耦
合,从而增加了系统的可扩展性和维护性。
仲裁者模式
中,仲裁者(Mediator)
是一个中心化
的对象,它定义了其他对象之间的通信方式。对象之间不再直接相互交互,而是通过仲裁者
进行通信。仲裁者模式
的关键是将系统中的交互逻辑封装在仲裁者
中,从而使得各个对象之间的关系变得简单清晰。
简单的说就是整个团队的交流过程变成了组员向仲裁者报告
,仲裁者
向组员
下达指示,一方面当发生麻烦事情的时候通知仲裁者
,当发生涉及全体组员
的事情的时候,也通知仲裁者
,当仲裁者下达指示的时候,组员会立即执行,团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向仲裁者报告,另一个方面仲裁者
可以站在整个团队的角度上对组员上报的事情做出决定,这就是仲裁者模式
,下面我们简单举例,让大家理解这个模式。
举例
类图
案例代码实现
-
仲裁者接口
这只是定义了一个仲裁者必需的方法,并没有实现,我们需要具体的仲裁者来实现它/**. * 仲裁者接口 */ public abstract class Mediator { /** * . 创建需要管理的组员 */ protected abstract void createColleagues(); /** * .会被每个组员调用,作用是让组员可以向仲裁者进行报告 * 当状态发生变化时,该方法会被调用 */ protected abstract void colleaguesChanged(); }
-
组员接口
,用来向仲裁者
汇报情况的接口,此处我们依旧需要具体实现它public interface Colleague { /** * . 设置一个仲裁者 * * @param mediator 当前的仲裁则对象 */ void setMediator(Mediator mediator); /** * . 告知组员仲裁者所下达的指示 * * @param enabled 开启与否 */ void setColleagueEnabled(boolean enabled); }
-
实现具体的
仲裁者
(此处我们设置了一个打印仲裁者
实现了其中的方法,设置了员工
和仲裁者
)/**. * 设置具体的仲裁者,打印仲裁者 */ public class PrintMediator extends Mediator{ /**. * 设置一个数字员工 */ private ColleagueNumber colleagueNumber; /**. * 设置一个字符串员工 */ private ColleagueString colleagueString; public PrintMediator() { createColleagues(); colleaguesChanged(); } /** * . 创建需要管理的组员 */ @Override protected void createColleagues() { // 设置字符串组员 colleagueString = new ColleagueString(); // 设置数字组员 colleagueNumber = new ColleagueNumber(); // 设置组员对应的仲裁者 colleagueString.setMediator(this); colleagueNumber.setMediator(this); } /** * .会被每个组员调用,作用是让组员可以向仲裁者进行报告 当状态发生变化时,该方法会被调用 */ @Override public void colleaguesChanged() { for (int i = 0; i < 10; i++) { if (i%2==1) { colleagueNumber.setColleagueEnabled(true); continue; } colleagueString.setColleagueEnabled(true); } } }
这里我们对于数据进行遍历,然后根据不同的状态进行不同的打印效果达到了测试的效果。下面我们实现具体,不同的打印员工
-
数字员工
/**. * 设置数字组员类 */ public class ColleagueNumber implements Colleague { /**. * 基于委托使用方法 */ private Mediator mediator; /** * . 设置一个仲裁者 * * @param mediator 当前的仲裁则对象 */ @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } /**. * 告知组员仲裁者所下达启用和禁止的指示 * @param enabled 开启与否 */ @Override public void setColleagueEnabled(boolean enabled) { if (enabled) { System.out.println("数字员工被调用"); } } }
-
字符串员工
/**. * 设置字符组员类 */ public class ColleagueString implements Colleague { /**. * 基于委托使用方法 */ private Mediator mediator; /** * . 设置一个仲裁者 * * @param mediator 当前的仲裁则对象 */ @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } /**. * 告知组员仲裁者所下达启用和禁止的指示 * @param enabled 开启与否 */ @Override public void setColleagueEnabled(boolean enabled) { if (enabled) { System.out.println("字符串员工被调用"); } } }
-
测试程序
public class Main { public static void main(String[] args) { Mediator mediator = new PrintMediator(); } }
如此我们可以看到根据不同的情况下,我们的仲裁可以下达指令使得员工做出不同的处理,
模式详解
- 必须包含的角色
- 抽象仲裁者 :使用抽象仲裁者我们可以定义一个仲裁者与员工进行通信和做出解决的接口。在我们的程序中由
Mediator
接口表示。 - 具体的仲裁者: 负责实现仲裁者接口中的方法做出实际决定,在实际程序中由
PrinterMediator
类扮演。 - 员工角色:College角色负责定义与仲裁者
Mediator
角色进行通信的接口,在我们的程序中由Colleague
。 - 具体的员工:负责实现员工角色的接口实现具体的功能,在我们的程序中由
ColleagueString
和ColleagueNumber
类来扮演这个角色
- 抽象仲裁者 :使用抽象仲裁者我们可以定义一个仲裁者与员工进行通信和做出解决的接口。在我们的程序中由
- 类图展示