设计模式:22-调停者模式(中介者模式)

一、适用场景:中介者模式提供了一个中介类来处理不同类之间的通信,降低各个类的相互耦合。比如同事之间的沟通,并不直接找对方,而是把消息发给项目管理者,由管理者去发送消息。
二、示例
1.创建抽象调停者类

package cn.edu.tju.app;

public abstract  class Mediator {
    public abstract void sendMessage(Colleague colleague,String name,String content);
    public abstract void addColleague(Colleague colleague);
}

2.创建具体的调停者类,用一个map来保存所有同事

package cn.edu.tju.app;

import java.util.HashMap;
import java.util.Map;

public class ConcreteMediator extends Mediator{
    private Map<String,Colleague> colleagueMap=new HashMap<>();
    @Override
    public void addColleague(Colleague colleague){
        colleagueMap.put(colleague.getName(),colleague);
    }

    @Override
    public void sendMessage(Colleague colleague, String name, String content) {
        Colleague destination=colleagueMap.get(name);
        if(destination!=null){
            System.out.println("【调停者转发】"+content+"[from "+colleague.getName()+" to "+name+"]");
            destination.receiveMessage(colleague.getName(),content);
        }

    }


}

3.创建抽象同事类,每个同事需要一个调停者属性

package cn.edu.tju.app;

public abstract class Colleague {
    private String name;
    protected Mediator mediator = null;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public abstract void receiveMessage(String source,String content);

    public abstract void sendMessage(String destination,String content);
}


4.创建具体同事类

package cn.edu.tju.app;

public class ConcreteColleague extends Colleague {
    @Override
    public void receiveMessage(String source,String content) {
        System.out.println("【"+this.getName()+" 收到】 "+content+" [from "+source+"]");
    }

    @Override
    public void sendMessage(String destination,String content) {
        System.out.println("【"+this.getName()+"给调停者发送】 "+content+" [to "+destination+"]");
        mediator.sendMessage(this,destination,content);
    }
}

5.创建主类,进行测试:

package cn.edu.tju.app;

public class ColleagueTest {
    public static void main(String[] args) {
        Mediator mediator=new ConcreteMediator();
        Colleague colleague1=new ConcreteColleague();
        colleague1.setName("张三");
        Colleague colleague2=new ConcreteColleague();
        colleague2.setName("李四");

        colleague1.setMediator(mediator);
        colleague2.setMediator(mediator);

        mediator.addColleague(colleague1);
        mediator.addColleague(colleague2);

        colleague1.sendMessage("李四","我需要一份帮助文档");
        colleague2.sendMessage("张三","在服务器/root目录");


    }
}

6.运行结果:
在这里插入图片描述

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

amadeus_liu2

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值