设计模式之仲裁者模式

设计模式之仲裁者模式

简介

仲裁者模式(Mediator Pattern)是一种行为型设计模式,它允许将复杂的系统划分为一组松耦合的对象,并通过这些对象的相互作用来实现更大的协作。该模式促进了对象之间的松耦合,从而增加了系统的可扩展性和维护性。

仲裁者模式中,仲裁者(Mediator)是一个中心化的对象,它定义了其他对象之间的通信方式。对象之间不再直接相互交互,而是通过仲裁者进行通信。仲裁者模式的关键是将系统中的交互逻辑封装在仲裁者中,从而使得各个对象之间的关系变得简单清晰。

简单的说就是整个团队的交流过程变成了组员向仲裁者报告仲裁者组员下达指示,一方面当发生麻烦事情的时候通知仲裁者,当发生涉及全体组员的事情的时候,也通知仲裁者,当仲裁者下达指示的时候,组员会立即执行,团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向仲裁者报告,另一个方面仲裁者可以站在整个团队的角度上对组员上报的事情做出决定,这就是仲裁者模式,下面我们简单举例,让大家理解这个模式。

举例

类图

案例类图

案例代码实现

  1. 仲裁者接口 这只是定义了一个仲裁者必需的方法,并没有实现,我们需要具体的仲裁者来实现它

    /**.
     * 仲裁者接口
     */
    public abstract class Mediator {
    
      /**
       * . 创建需要管理的组员
       */
      protected abstract void createColleagues();
    
      /**
       * .会被每个组员调用,作用是让组员可以向仲裁者进行报告
       * 当状态发生变化时,该方法会被调用
       */
      protected abstract void colleaguesChanged();
    }
    
  2. 组员接口,用来向仲裁者汇报情况的接口,此处我们依旧需要具体实现它

    public interface Colleague {
    
    /**
     * . 设置一个仲裁者
     *
     * @param mediator 当前的仲裁则对象
     */
     void setMediator(Mediator mediator);
    
    /**
     * . 告知组员仲裁者所下达的指示
     *
     * @param enabled 开启与否
     */
    void setColleagueEnabled(boolean enabled);
    }
    
  3. 实现具体的仲裁者(此处我们设置了一个打印仲裁者实现了其中的方法,设置了员工仲裁者)

    /**.
     * 设置具体的仲裁者,打印仲裁者
     */
    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);
        }
      }
    }
    

    这里我们对于数据进行遍历,然后根据不同的状态进行不同的打印效果达到了测试的效果。下面我们实现具体,不同的打印员工

  4. 数字员工

    
    /**.
     * 设置数字组员类
     */
    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("数字员工被调用");
        }
      }
    }
    
  5. 字符串员工

    /**.
     * 设置字符组员类
     */
    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("字符串员工被调用");
        }
      }
    }
    
  6. 测试程序

    public class Main {
    
      public static void main(String[] args) {
        Mediator mediator = new PrintMediator();
      }
    }
    

    如此我们可以看到根据不同的情况下,我们的仲裁可以下达指令使得员工做出不同的处理,

模式详解

  1. 必须包含的角色
    1. 抽象仲裁者 :使用抽象仲裁者我们可以定义一个仲裁者与员工进行通信和做出解决的接口。在我们的程序中由Mediator接口表示。
    2. 具体的仲裁者: 负责实现仲裁者接口中的方法做出实际决定,在实际程序中由PrinterMediator类扮演。
    3. 员工角色:College角色负责定义与仲裁者Mediator角色进行通信的接口,在我们的程序中由Colleague
    4. 具体的员工:负责实现员工角色的接口实现具体的功能,在我们的程序中由ColleagueStringColleagueNumber类来扮演这个角色
  2. 类图展示
«interface»
Mediator
createColleagues()
colleagueChanged()
«interface»
Colleague
mediator
void setMediator(Mediator mediator)
void setColleagueEnabled(boolean enabled)
ConcreteMediator
concreteColleague1
concreteColleague2
createColleagues()
colleaguesChanged()
ConcreteColleague1
setMediator(Mediator mediator)
setColleagueEnabled(boolean enabled)
ConcreteColleague2
setMediator(Mediator mediator)
setColleagueEnabled(boolean enabled)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值