首页 > 其他分享 >初识设计模式 - 中介模式

初识设计模式 - 中介模式

时间:2022-11-09 08:44:51浏览次数:60  
标签:task 对象 void 同事 中介 初识 设计模式 public

简介

中介设计模式(Mediator Design Pattern)定义了一个单独的(中介)对象,来封装一组对象之间的交互。

如果对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象的其他所有对象,并进行适当处理。

而中介模式将这些对象之间的交互委派给中介对象交互,来避免对象之间直接交互,使其耦合松散。

典型实现

首先,定义一个抽象中介者接口,该接口用于与各对象之间进行通信。其代码示例如下:

public abstract class Mediator {
    // 维持所有同事对象的引用
    protected ArrayList<Colleague> colleagues;

    // 注册方法,用于增加同事对象
    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    // 声明抽象的业务方法
    public abstract void operation();
}

对于具体的中介者对象,主要是实现自己的业务方法,封装同事之间的调用。其代码示例如下:

public class ConcreteMediator extends Mediator {
    @Override
    public void operation() {
        // 通过中介者调用同事类的方法
        this.colleagues.get(0).method1();
    }
}

然后,需要定义一个抽象的同事类,其维持了一个抽象中介者的引用,用于调用中介者的方法。其代码示例如下:

public abstract class Colleague {
    // 维持一个抽象中介者的引用
    protected Mediator mediator;

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

    // 声明自身方法,处理自己的行为
    public abstract void method1();

    // 定义依赖方法,与中介者通信
    public void method2() {
        mediator.operation();
    }
}

具体的同事类也比较简单,只需要继承自抽象同事类,然后定义好自己的行为即可。

总结

优点

中介模式的主要优点如下:

  • 中介模式将一对多的关系简化成了一对一的关系,降低了类的复杂度,简化了对象之间的交互
  • 将各同事对象解耦,增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”
  • 中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须对同事类进行扩展

缺点

中介模式的主要缺点如下:

  • 具体的中介者类中包含了大量同事之间的交互逻辑,可能会导致具体中介者类非常复杂

适用场景

中介模式的适用场景如下:

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
  • 一个对象由于引用了许多其他对象并且直接和这些对象通信,导致难以复用该对象
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多子类

源码

在 JDK 中 java.util.Timer 就使用到了中介模式。如下是其源码部分:

public class Timer {
    private final TaskQueue queue = new TaskQueue();

    private void sched(TimerTask task, long time, long period) {
        if (time < 0)
            throw new IllegalArgumentException("Illegal execution time.");

        if (Math.abs(period) > (Long.MAX_VALUE >> 1))
            period >>= 1;

        synchronized(queue) {
            if (!thread.newTasksMayBeScheduled)
                throw new IllegalStateException("Timer already cancelled.");

            synchronized(task.lock) {
                if (task.state != TimerTask.VIRGIN)
                    throw new IllegalStateException(
                        "Task already scheduled or cancelled");
                task.nextExecutionTime = time;
                task.period = period;
                task.state = TimerTask.SCHEDULED;
            }

            queue.add(task);
            if (queue.getMin() == task)
                queue.notify();
        }
    }
}

标签:task,对象,void,同事,中介,初识,设计模式,public
From: https://www.cnblogs.com/fatedeity/p/16872378.html

相关文章

  • 一:JVM初识以及内存模型
    一:认识JVM1.1什么是JVMjava:跨平台的语言,jvm:跨语言的平台虚拟机分为程序虚拟机和系统虚拟机系统虚拟机是对物理计算机的一个仿真,提供了一个可运行完整操作系统平台的......
  • 浅谈PHP设计模式的代理模式
    简介:代理模式,是结构型的设计模式。用于为其它对象提供一种代理以控制对这个对象的访问。目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象,并且可以在不......
  • 魔法方法、元类、设计模式
    目录魔法方法、元类、设计模式面向对象的魔法方法基于魔法方法的笔试题元类简介创建类的两种方式元类定制类的产生行为元类定制对象的产生行为魔法方法之双下new方法设计模......
  • 设计模式及单例模式
    设计模式及单例模式设计模式简介​前人通过大量的验证,所创建出来的解决一些问题的固定高效方法IT行业的设计模式​IT行业的设计模式一共有23种,分为:创建型、结构型、......
  • 【前端面试题】06—16道设计模式面试题(附答案)
    设计模式不是针对某个框架的,而是针对某类问题或某类需求提出的,因此有广泛的适用性。我们学习设计模式不仅要学习理论,还要学习如何解决实际工作中的问题,所以在面试中,设计模式......
  • 初识操作符
    //操作符://算数操作符:+,-,*,/,%//注意:include<stdio.h>intmain(){inta=9/2;//得数为4,整型floatb=9/2;//得数为4.000floatc=9/2.0;//带小数位,得数......
  • 中介者模式
    在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:1.新的具体聊天室中发送的图片大小不得超过20M。2.新的具体聊天室中发送的文字长度不得......
  • 初识函数
    //非函数方式//#include<stdio.h>//intmain()//{// inta=0;// intb=0;// scanf_s("%d%d",&a,&b);// intc=a+b;//// printf("%d\n",c);// return......
  • React组件设计模式-纯组件,函数组件,高阶组件
    一、组件(1)函数组件如果你想写的组件只包含一个render方法,并且不包含state,那么使用函数组件就会更简单。我们不需要定义一个继承于React.Component的类,我们可以定......
  • 设计模式—建造者模式
    我们通常在开发中见到一种链式的构造对象,比如:demoAnimatordemoAnimator=newdemoAnimator.Builder().setFade(true).setDuration(1000).build();那他是怎样实现的呢、......