当前位置: 首页 > 后端技术 > Java

设计模式中的中介模式

时间:2023-04-01 22:15:16 Java

在我们的实际业务中,可能会有多个类相互调用,形成一个复杂的网络结构。这时候就需要有一种模式来“理顺”它们之间的关系,引出一个中介,让类之间不再相互调用。这种模式就是我们今天的主角——中介模式。1.概念理解首先看一下中介模式的官方概念:用一个中介对象来封装一系列的对象交互,中介使得各个对象之间无需显式引用就可以相互引用,从而实现松耦合和可以独立改变它们之间的相互作用。通俗的解释就是引入了一个“中介”来协调各个对象之间的关系。对象之间不需要直接调用。对象只需要调用中介的方法,中介在中介内部进行逻辑判断即可。对象的方法。概念基本清楚后,我们再来看中介模型中包含的角色:中介角色和各个对象的角色是必须的。在面向接口编程的原则下,中介和对象应该从接口中分离出来,所以在中介模式结构中包括四个角色(每个对象角色称为一个同事):1.中介者:中介者是一个接口,它定义Colleague对象之间的通信方法;2.ConcreteMediator:具体的中介者是实现中介者接口的类。具体中介需要包含对所有具体同事(ConcreteColleague)的引用,通过实现中介接口中的方法来满足具体同事之间的通信需求;3.同事:一个接口,指定具体同事需要实现哪些方法;4.具体同事(ConcreteColleague):实现了Colleague接口的类。特定同事需要包括对特定调解员的引用。当一个特定的同事需要与其他特定的同事进行交互时,他只需要将他的请求通知到它包含的特定调解器的引用。如果在一个业务场景中,一个公司有很多同事,同事1管理自己的数据,有时会调用同事2的数据。在中介模式下,同事1和同事2不再互相调用,而是被中介调用。中介对象必须持有在同事类中,中介方法必须有一个方法来确定它属于哪个角色。基于四个角色,实现初测的demo。读者可以拉取完整代码在本地学习,测试通过后将代码上传至码云。2.案例实现抽象同事类:中间人的引用应该放在抽象同事/***抽象同事类*@authortcy*@Date14-09-2022*/publicabstractclassColleague{//抽象中介引用受保护的Mediator中介;publicColleague(Mediatormediator){this.mediator=mediator;}//数据更新方法publicabstractvoidupdate();//数据变化方法publicabstractvoidchanged();}具体同事类1和2:具体同事类除了自身的业务逻辑,还应该有调用中介的额外方法/***具体同事2*@作者tcy*@Date14-09-2022*/publicclassConcreteColleague2extendsColleague{publicConcreteColleague2(Mediatormediator){super(mediator);}//自己的方法@Overridepublicvoidupdate(){System.out.println("更新同事类2");}//同事@Override的调用方法publicvoidchanged(){System.out.println("同事2班数据改变");调解员.操作(这个);}}/***具体同事1*@authortcy*@Date14-09-2022*/publicclassConcreteColleague1extendsColleague{publicConcreteColleague1(Mediatormediator){super(调解员);}@Overridepublicvoidupdate(){System.out.println("更新同事类1");}@Overridepublicvoidchanged(){System.out.println("同事1班数据变更");调解员.操作(这个);}}抽象中介:抽象中介应该持有所有同事对象,并且应该有调用其他同事的方法/***抽象中介*/publicabstractclassMediator{protectedArrayListcolleagues=newArrayList<>();publicvoidadd(Colleaguecolleague){colleagues.add(colleague);}publicabstractvoidoperation(Colleaguecolleague);}具体中介:具体中介实现抽象中介方法根据条件调用不同同事/***具体中介*@authortcy*@Date14-09-2022*/publicclassConcreteMediatorextendsMediator{@Overridepublicvoidoperation(Colleaguecolleague){if(colleagueinstanceofConcreteColleague1)colleagues.get(1).update();elseif(colleagueinstanceofConcreteColleague2)colleagues.get(0).update();}}三、中介者模式在源码中的应用中介者模式的典型应用是JdkTi中mer类我们知道,Timer类的主要功能是用于定时任务。定时任务之间会存在通信问题。如果多个定时任务相互通信,对于系统对象之间的引用将是一场灾难,导致中介模式理应如此。当有新任务加入队列时,该任务就被视为同事,各个任务之间的通信由Timer类完成,相当于中间人的作用。我们知道Timer类实现定时任务的主要方法是schedule(),而schedule()有一堆重载方法。我们单击任何计划方法。publicvoidschedule(TimerTasktask,DatefirstTime,longperiod){if(period<=0)thrownewIllegalArgumentException("Non-positiveperiod.");sched(task,firstTime.getTime(),-period);}两者都调用了sched()私有方法。我们关注红线标记的代码块,将任务放入队列中,与我们例子中的Arrlist效果相同。privatefinalTaskQueuequeue=newTaskQueue();判断后调用Object的notify()方法进行线程间通信。试想一下,如果没有这个中介,手动为每个定时任务调用notify()方法会是多么痛苦。4.总结网上有很多讲解设计模式的文章。解释清楚中间模式很容易,但解释什么时候使用合适的设计模式就更难了。在前三章设计模式的基础上,阅读第四章后,希望读者能够对设计模式的正确使用有一个清晰的认识。网上很多博客都说,只有责任明确了,才能采用中介模式。如果类的职责混乱,中介的逻辑就很难写了。多个对象之间也存在严重的耦合,类图之间出现网络结构。这时候可以考虑中介模式。如果仅仅用于中介模式的使用,则得不偿失。中介优势凸显,中介模式的出现将网络结构向星型结构有序转变。它可以有序地降低类的复杂度,将多对多关系转化为一对多关系,降低类之间的耦合度。缺点也很明显,会增加类的数量,类越多,中介的逻辑就越复杂。本文参与思维科技论文征集,正在阅读的朋友欢迎加入。