中介者、调停者Intermediary模式
发表于|更新于|设计模式
|浏览量:
调节互相直接的关系
该模式让你将对象间的所有关系抽取成为一个单独的类, 以使对于特定组件的修改工作独立于其他组件。
- 抽象中介者接口声明了一个能让组件将各种事件通知给中介者的方法。中介者可对这些事件做出响应并将执行工作传递给其他组件。
- 具体中介者类可解开各组件之间相互交叉的连接关系并将其转移到中介者中。
- 创建所有组件对象并将当前中介者传递给其构造函数以建立连接。
- 当组件中有事件发生时,它会通知中介者。中介者接收到通知后可自行处理,也可将请求传递给另一个组件。
- 抽象组件会使用中介者接口与中介者进行交互。因此只需将它们与不同的中介者连接起来,你就能在其他情境中使用这些组件了。
- 具体组件之间无法进行交流。它们只有一个交流渠道,那就是向中介者发送通知。

应用
消息中间件
文章作者: 褚成志
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 褚成志的分享站!
相关推荐
2026-04-09
模板方法TemplateMethod
就是钩子函数 模板已经写好了 重写方法,系统自动调用,都是模板方法 使用的时候面向接口编程,这就是模板方法 在我们开发业务逻辑的时候,可能会遇到流程复杂的逻辑,而这个复杂逻辑本身是可以拆解成多个小的行为,这些小的行为本身可能根据业务场景的不同而有所变化。 这里我们以转账流程为例,如下图所示,整个转账流程是固定的,但是“验证密码”“验证余额”和“扣除金额”这三步针对不同的银行卡,要调用不同银行的接口去完成。为了让整个复杂流程的代码具有更好的扩展性,我们一般会使用模板方法模式来处理。 在模板方法模式中,我们可以将复杂流程中每个步骤的边界确定下来,然后由一个“模板方法”定义每个步骤的执行流程,每个步骤对应着一个方法,这些方法也被称为“基本方法”。模板方法按照业务逻辑依次调用上述基本方法,来实现完整的复杂流程。 模板方法模式会将模板方法以及**不需要随业务场景变化的基本方法放到父类中实现,随业务场景变化的基本方法会被定义为抽象方法,由子类提供真正的实现。** 下图展示了模板方法模式的核心类,其中 template() 方法是我们上面描述的模板方法,part1() 方法和 part3()...
2026-04-09
迭代器模式Iterator
定义迭代器的接口,以及对应的hasNext以及next方法 注意定义的时候使用泛型,不然接口方法的返回值只能是Object,实际使用的时候还需要强制转换 在被迭代的接口里面定义获取迭代器的方法 注意使用泛型 在需要被迭代的对象里面实现一个具体迭代器,专属于这个对象的迭代器以及对应的迭代方法,每一个对象的迭代遍历的方法应该是不一样 注意实现被迭代接口的时候标注的泛型依旧是被迭代对象 public class MyArrayList<E> implements MyCollection<E> 实现(注意适应泛型)定义迭代器的抽象方法1234567891011package com.deltaqin.designPattern.d06_iterator;/** * @author deltaqin * @date 2021/3/27 10:38 上午 */public interface MyIterator<T> { boolean hasNext(); T next();} 定义集合的抽象方法12...
2026-04-09
观察者模式Observer
观察者接口:Observer接口、Listener接口、Hook、Callback 具体观察者:实现Observer接口 事件类 :不仅仅包含时间,事件,还包含事件源。这样观察者拿到事件知道是谁发的才可以做有区别的处理 事件源对象:被观察者Object, 事件源对象,新建事件对象。事件源自己会维护很多监听器。可以调用监听器接口的方法, **事件对象 **穿过 Observer的链条 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485package com.deltaqin.designPattern.d09_observer;import java.util.ArrayList;import java.util.List;/** * @author deltaqin * @date 2021/3/27 12...
2026-04-09
责任链模式ChainofResponsibility
简单实现–实现链式调用以及调用链中断1234567891011121314151617interface Filter { boolean doFilter(Msg m);}class HTMLFilter implements Filter { @Override public boolean doFilter(Msg m) { String r = m.getMsg(); r = r.replace('<', '['); r = r.replace('>', ']'); m.setMsg(r); return true; }}// ... 其他具体的过滤器实现类 调用链也实现Filter接口,是为了可以两个链子连起来。也就是说把后面的链子当做过滤器的**List的最后一个元素。利用了多态,都实现了doFilter,但是具体的过滤器是...
2026-04-09
备忘录模式memento
序列化反序列使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。 案例Gender类,是一个枚举类型,表示性别 123public enum Gender { MALE, FEMALE } 每个枚举类型都会默认继承类java.lang.Enum,而该类实现了Serializable接口,所以枚举类型对象都是默认可以被序列化的。 123456789101112131415161718192021222324252627282930313233343536public class Person implements Serializable...
2026-04-09
状态模式State
根据状态决定动作 不同状态下的同一动作有不同的实现,就是一个简单的多态。简单面向接口编程 应用:TCP 不同的状态下open close ack的方法的实现是不一样的,扩展方法是不方便的,方法不扩展可以使用状态模式 线程状态案例 线程是上下文 线程状态是State Running,Blocking等等是具体的状态 状态接口1234public abstract class ThreadState_ { abstract void move(Action input); abstract void run();} 具体状态123456789101112131415161718public class NewState extends ThreadState_ { private Thread_ t; public NewState(Thread_ t) { this.t = t; } @Override void move(Action input) { ...
公告
👋 你好,我是褚成志,一名专注于云原生与后端架构的工程师。
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
