您现在的位置是:首页 > 正文

中介者模式(Mediator)

2024-02-01 03:48:08阅读 3

中介者模式(Mediator)

1.意图

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
在下列情况下使用中介者模式 :
• 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
• 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
• 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

2.特点

• Mediator(中介者 )
— 中介者定义一个接口用于与各同事(Colleague)对象通信。
• ConcreteMediator(具体中介者)
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
• Colleague class(同事类)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。

同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。

3.UML类图

中介者模式

4.代码

/**
 * Mediator(中介者 )
 — 中介者定义一个接口用于与各同事(Colleague)对象通信。
 */
public interface Mediator {
    void contact(String message,Colleague coll);
}
/**
 * ConcreteMediator(具体中介者)
 — 具体中介者通过协调各同事对象实现协作行为。
 — 了解并维护它的各个同事。
 */
public class ConcreteMediator implements Mediator {
    private List<Colleague> list = new ArrayList<Colleague>();

    public void addColleague(Colleague colleague){
        list.add(colleague);
    }

    /**
     * 中介者联系具体的同事类.将消息发送给同事类
     * @param message
     * @param coll
     */
    @Override
    public void contact(String message, Colleague coll) {

        for(Colleague colleague:list){
            if(colleague!=coll)
                colleague.getMessage(message);
        }
    }
}

/**
 * 抽象同事类
 * 每个同事类必须持有自己的中介者.
 */
public abstract class Colleague {
    protected String name;
    protected Mediator mediator;

    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

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

    public abstract void getMessage(String message);

    public abstract void contact(String message);
}
/**
 * Colleague class(同事类)
 — 每一个同事类都知道它的中介者对象。
 — 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
 */
public class ColleagueA extends Colleague {
    public ColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 得到中介者的消息
     * @param message
     */
    public void getMessage(String message){
        System.out.println("同事-"+name+"收到消息:"+message);
    }

    /**
     * 通过中介者发布消息
     * @param message
     */
    public void contact(String message){
        mediator.contact(message,this);
    }
}
public class MediatorTest {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Colleague colleaguea = new ColleagueA("A",mediator);
        Colleague colleagueb = new ColleagueA("B",mediator);
        Colleague colleaguec = new ColleagueA("C",mediator);
        mediator.addColleague(colleaguea);
        mediator.addColleague(colleagueb);
        mediator.addColleague(colleaguec);

        colleaguea.contact("吃饭了");
        colleagueb.contact("今天吃什么?");
        colleaguec.contact("肯德基吧.");
        colleaguea.contact("好啊.");
        colleagueb.contact("行");
    }
}

网站文章

  • newifi_dts

    /*包含头文件*/#include "mt7621.dtsi"//板子级别#include <dt-bindings/gpio/gpio.h>#include <dt-bindings/input/i...

    2024-02-01 03:48:00
  • 进程、线程及协程的区别

    进程、线程及协程的区别

    一、概念 **进程:**进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位; **线程:**线程是进程的一个执行单元,是任务调度和系统执行的基本单位;...

    2024-02-01 03:47:33
  • opengles学习笔记

    GLSL语言里面的 attribute和uniform类型的变量,在程序中通过GLES20.glGetAttribLocation和GLES20.glGetUniformLocation获取, 这里获...

    2024-02-01 03:47:25
  • Android 当前时间差,返回几分钟前、几小时前、几个月前

    总DateUtil时间工具类地址: 需求: 以前的一个时间和当前时间多对比,返回几分钟前、几小时前、几个月前、几年前 代码: /** * 时间差 * * @param date * @return */ public static String getTimeFormatText(Date date) { long...

    2024-02-01 03:47:18
  • logback.xml配置文件logger与root标签详解

    logback.xml配置文件logger与root标签详解

    2024-02-01 03:46:49
  • 自定义服务器控件,将web方法添加到自定义服务器控件

    我创建了一个服务器用户控件,我希望它能够使用WebMethod。如果Web方法在我的主应用程序(作为ASMX文件),它工作正常。问题是我想将此方法包含在与用户控件相同的项目库中,以便我可以将DLL作为...

    2024-02-01 03:46:43
  • pip安装超时,Exception:Traceback(most recent call last)

    pip安装 Exception:Traceback

    2024-02-01 03:46:35
  • u3d游戏客户端面试遇到需要准备的知识

    三 常问的问题1 你们游戏中模型的顶点数面数的要求?角色的面数控制在2000以内,小怪控制在1500以内2 你对UI优化的一些处理优化由Unity UI实现的用户界面是一门艺术。很少见很清楚的规则,相反,每种情况都必须联系系统行为,仔细考虑评估。考虑优化Unity UI时最核心的原则是结合开销,平衡draw calls,复杂的UI 需要做权衡这里有Unity UI用户遇到的四个常见的问题过...

    2024-02-01 03:46:29
  • readme, 自学记录

    这里的文章用于自学记录,便于忘记时翻查。不经常使用的东西,很容易忘记,所以记录在这里。其中的发现,也都是基于自己电脑、系统、软件、折腾经历、等相关,不具有普遍性。如果我的经历对你有所帮助,很开心。如果没有帮助,请到“其它店家”看看。谢谢包含。欢迎指点。...

    2024-02-01 03:46:00
  • Centos7 最小化安装,导致 ifconfig,netstat 命令找不到

    在使用 Linux/UNIX 时,会经常遇到 “command not found” 的错误,就如提示的信息,Linux /UNIX 没有找到该命令。原因在于命令拼写错误或 Linux/UNIX 系统...

    2024-02-01 03:45:52