当前位置: 首页 > article >正文

【设计模式-行为型】调停者模式

一、什么是调停者模式

        接下来是调停者模式,还是那个思路,我们从经典电影中来举个例子吧,下面有请调停者大师-----《金钱帝国》中的 徐乐功(梁家辉饰演)。该片是讲诉香港廉政公署成立前,黑社会及警察之间的一些幕后交易。其中有一个情结英国政府派出得力干将决定整治香港乱象,这个经典台词就是在老外上任第一天的情景。来上台词

《金钱帝国》-徐乐功经典台词:

        “乐哥,我听说那老外很拽啊!”

        “呵呵,我家的狗旺财也很拽呀,它见人就咬就是不咬我!为什么?我养它嘛~哈哈”

        “喂,究竟那个老外他是收钱还是不收钱?”

        “我现在不敢问!”

        “会有猫不吃鱼嘛?恩?我没当探长的时候,保护费都是乱收的。全香港警察都可以收钱,每条街上有几十家地下赌场和妓院,天天打架,破案率低的吓死人!自从我认识了猪油仔,我们俩一起订立规矩,统一收钱。局长收三成,我们这些探长收两成,其余全香港的警察分享三成半,限定每条街地下妓院和赌场的数量,让所有妓女都招到客,地下赌场都有生意做,那些混混有钱赚就不会打架咯!我们的破案率是有史以来最高的!我就不信这个老外敢破坏规矩。如果再搞到天天砍人,尸横遍野的时候,我看他怎么负这个责!”

        这句台词充分体现了徐乐功作为调停者的角色,他通过重新分配资源和制定规则,维持了“香港警界和黑社会的秩序”。这种模式不仅减少了内部的混乱和冲突,还提高了整体的效率和稳定性,调停者模式是一种行为型设计模式,通过引入一个调停者对象来集中处理一组对象之间的交互。这种模式的目标是减少对象之间的直接通信。

二、为什么使用调停者模式

  1. 复杂的交互关系:在电影中,香港警界和黑社会之间存在着复杂的利益关系和频繁的交互。如果没有一个统一的协调者,这些关系很容易变得混乱,导致内部冲突和效率低下。

  2. 集中管理:徐乐功通过制定规则和重新分配资源,集中管理了警界和黑社会的交互。这种集中管理的方式使得复杂的交互关系变得有序,减少了直接的冲突和混乱。

  3. 动态变化的交互:当外部环境发生变化(如新的探长上任)时,徐乐功可以通过调整规则和资源分配来应对变化,而不需要改变整个系统的结构。

  4. 简化对象关系:调停者模式将多对多的交互关系转化为一对多的交互关系,使得对象之间的关系更容易理解和实现。各部门和黑社会中间人只需要与徐乐功交互,而不需要与其他对象直接交互。

三、调停者模式示例

1. 定义同事接口(Colleague)(需要被调停的人的统一行为
public interface Colleague {
    void setMediator(Mediator mediator);
    void receiveMessage(String message);
}

2. 实现具体同事类(ConcreteColleague) (具体要被调停的人、警察、黑帮等

public class PoliceDepartment implements Colleague {
    private Mediator mediator;
    private String name;

    public PoliceDepartment(String name) {
        this.name = name;
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " 收到消息: " + message);
    }

    public void requestResource(String resource) {
        mediator.requestResource(this, resource);
    }

    public void enforceOrder() {
        System.out.println(name + " 维持秩序,确保破案率提高。");
    }
}


public class BlackMarket implements Colleague {
    private Mediator mediator;
    private String name;

    public BlackMarket(String name) {
        this.name = name;
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " 收到消息: " + message);
    }

    public void requestResource(String resource) {
        mediator.requestResource(this, resource);
    }

    public void provideProtectionFee() {
        System.out.println(name + " 提供保护费,确保黑市稳定。");
    }
}

3. 定义调停者接口(Mediator) (调停者的行为

public interface Mediator {
    void requestResource(Colleague colleague, String resource);
}
4. 实现具体调停者类(ConcreteMediator)(徐乐功
public class PoliceMediator implements Mediator {
    private PoliceDepartment policeDepartment;
    private BlackMarket blackMarket;

    public void setPoliceDepartment(PoliceDepartment policeDepartment) {
        this.policeDepartment = policeDepartment;
    }

    public void setBlackMarket(BlackMarket blackMarket) {
        this.blackMarket = blackMarket;
    }

    @Override
    public void requestResource(Colleague colleague, String resource) {
        if (colleague == policeDepartment) {
            if (resource.equals("保护费")) {
                blackMarket.receiveMessage("警察局请求保护费。");
                blackMarket.provideProtectionFee();
            }
        } else if (colleague == blackMarket) {
            if (resource.equals("保护费")) {
                policeDepartment.receiveMessage("黑市提供保护费。");
                policeDepartment.enforceOrder();
            }
        }
    }
}

5、调停场景重现

public class Main {
    public static void main(String[] args) {
        // 创建具体同事对象
        PoliceDepartment policeDepartment = new PoliceDepartment("警察局");
        BlackMarket blackMarket = new BlackMarket("黑市");

        // 创建具体调停者对象
        PoliceMediator mediator = new PoliceMediator();

        // 设置调停者
        policeDepartment.setMediator(mediator);
        blackMarket.setMediator(mediator);

        // 设置同事对象
        mediator.setPoliceDepartment(policeDepartment);
        mediator.setBlackMarket(blackMarket);

        // 请求资源
        policeDepartment.requestResource("保护费");
    }
}


//输出
黑市 收到消息: 警察局请求保护费。
黑市 提供保护费,确保黑市稳定。
警察局 收到消息: 黑市提供保护费。
警察局 维持秩序,确保破案率提高。


http://www.kler.cn/a/519091.html

相关文章:

  • 【6】YOLOv8 训练自己的分割数据集
  • 使用python-docx包进行多文件word文字、字符批量替换
  • Java 大视界 -- Java 大数据中的隐私增强技术全景解析(64)
  • 矩阵快速幂
  • Linux学习笔记——网络管理命令
  • Linux的基本指令(上)
  • libOnvif通过组播不能发现相机
  • 51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片)
  • SpringBoot3+Vue3开发学生选课管理系统
  • CSS 中的 id 和 class 选择器
  • ARM嵌入式学习--第九天(串口通信)
  • 二十三种设计模式-享元模式
  • minikube源码学习
  • 【自然语言处理(NLP)】jieba分词的使用(分词模式、关键词提取)
  • 【BQ3568HM开发板】深入解析智能家居中控屏工程的NAPI接口设计
  • 视觉语言模型 (VLMs):跨模态智能的探索
  • [ACTF2020 新生赛]BackupFile1
  • 【Redis】在ubuntu上安装Redis
  • 每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
  • Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
  • CSS(二)——选择器
  • 个人网站搭建
  • 基于Flask的北京房屋租赁管理系统的设计与实现
  • 从管道符到Java编程
  • Linux 常用命令——网络篇(保姆级说明)
  • jira.issueviews