网站建设提供ftp,wordpress做一个审核程序,发布设计任务的网站,软文写作的技巧Java设计模式之中介者模式详解 一、中介者模式核心思想
核心目标#xff1a;通过中介对象封装一组对象间的交互#xff0c;将网状的对象关系转变为星型结构。如同机场控制塔协调所有飞机的起降#xff0c;避免飞机之间直接通信导致的混乱。 二、中介者模式类图#xff08;…Java设计模式之中介者模式详解 一、中介者模式核心思想
核心目标通过中介对象封装一组对象间的交互将网状的对象关系转变为星型结构。如同机场控制塔协调所有飞机的起降避免飞机之间直接通信导致的混乱。 二、中介者模式类图Mermaid #mermaid-svg-gWBG7DyS3G7a67LW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gWBG7DyS3G7a67LW .error-icon{fill:#552222;}#mermaid-svg-gWBG7DyS3G7a67LW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gWBG7DyS3G7a67LW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gWBG7DyS3G7a67LW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gWBG7DyS3G7a67LW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gWBG7DyS3G7a67LW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gWBG7DyS3G7a67LW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gWBG7DyS3G7a67LW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gWBG7DyS3G7a67LW .marker.cross{stroke:#333333;}#mermaid-svg-gWBG7DyS3G7a67LW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gWBG7DyS3G7a67LW g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-gWBG7DyS3G7a67LW g.classGroup text .title{font-weight:bolder;}#mermaid-svg-gWBG7DyS3G7a67LW .nodeLabel,#mermaid-svg-gWBG7DyS3G7a67LW .edgeLabel{color:#131300;}#mermaid-svg-gWBG7DyS3G7a67LW .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-gWBG7DyS3G7a67LW .label text{fill:#131300;}#mermaid-svg-gWBG7DyS3G7a67LW .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-gWBG7DyS3G7a67LW .classTitle{font-weight:bolder;}#mermaid-svg-gWBG7DyS3G7a67LW .node rect,#mermaid-svg-gWBG7DyS3G7a67LW .node circle,#mermaid-svg-gWBG7DyS3G7a67LW .node ellipse,#mermaid-svg-gWBG7DyS3G7a67LW .node polygon,#mermaid-svg-gWBG7DyS3G7a67LW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gWBG7DyS3G7a67LW .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-gWBG7DyS3G7a67LW g.clickable{cursor:pointer;}#mermaid-svg-gWBG7DyS3G7a67LW g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-gWBG7DyS3G7a67LW g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-gWBG7DyS3G7a67LW .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-gWBG7DyS3G7a67LW .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-gWBG7DyS3G7a67LW .dashed-line{stroke-dasharray:3;}#mermaid-svg-gWBG7DyS3G7a67LW #compositionStart,#mermaid-svg-gWBG7DyS3G7a67LW .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #compositionEnd,#mermaid-svg-gWBG7DyS3G7a67LW .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #dependencyStart,#mermaid-svg-gWBG7DyS3G7a67LW .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #dependencyStart,#mermaid-svg-gWBG7DyS3G7a67LW .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #extensionStart,#mermaid-svg-gWBG7DyS3G7a67LW .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #extensionEnd,#mermaid-svg-gWBG7DyS3G7a67LW .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #aggregationStart,#mermaid-svg-gWBG7DyS3G7a67LW .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW #aggregationEnd,#mermaid-svg-gWBG7DyS3G7a67LW .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-gWBG7DyS3G7a67LW .edgeTerminals{font-size:11px;}#mermaid-svg-gWBG7DyS3G7a67LW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 协调 协调 通信 «interface» Mediator notify(Component, String) ConcreteMediator -componentA: ComponentA -componentB: ComponentB notify(Component, String) «abstract» Component -mediator: Mediator setMediator(Mediator) notifyMediator(String) ComponentA operationA() reactToB() ComponentB operationB() reactToA() 三、代码实现示例
1. 聊天室场景
// 中介者接口
interface ChatMediator {void sendMessage(String msg, User user);void addUser(User user);
}// 具体中介者聊天室
class ChatRoom implements ChatMediator {private ListUser users new ArrayList();public void addUser(User user) {users.add(user);}public void sendMessage(String msg, User sender) {for (User user : users) {if (user ! sender) { // 不发送给自己user.receive(msg);}}}
}// 抽象组件
abstract class User {protected ChatMediator mediator;protected String name;public User(String name, ChatMediator mediator) {this.name name;this.mediator mediator;}public abstract void send(String msg);public abstract void receive(String msg);
}// 具体组件聊天用户
class ChatUser extends User {public ChatUser(String name, ChatMediator mediator) {super(name, mediator);}public void send(String msg) {System.out.println(name 发送: msg);mediator.sendMessage(msg, this);}public void receive(String msg) {System.out.println(name 收到: msg);}
}// 客户端调用
public class Client {public static void main(String[] args) {ChatMediator chatRoom new ChatRoom();User alice new ChatUser(Alice, chatRoom);User bob new ChatUser(Bob, chatRoom);User charlie new ChatUser(Charlie, chatRoom);chatRoom.addUser(alice);chatRoom.addUser(bob);chatRoom.addUser(charlie);alice.send(大家好);/* 输出Alice 发送: 大家好Bob 收到: 大家好Charlie 收到: 大家好 */}
}四、模式优缺点分析
✅ 优势
解耦对象关系组件间无需直接引用简化交互协议统一通过中介者通信集中控制逻辑交互规则在中介者中维护减少子类数量避免为不同交互创建大量子类
❌ 缺点
中介者可能复杂随着交互增加中介者可能成为上帝对象性能瓶颈所有通信经过中介者可能成为系统瓶颈过度设计风险简单交互场景不适用 五、典型应用场景
GUI组件交互表单验证输入框、按钮、标签联动聊天系统群聊消息分发航空管制协调飞机起降分布式系统服务注册与发现如Eureka工作流引擎任务节点间的协调游戏开发NPC行为协调 六、Mermaid序列图交互流程 #mermaid-svg-GLbgDzbRYWfQwA0c {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c .error-icon{fill:#552222;}#mermaid-svg-GLbgDzbRYWfQwA0c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GLbgDzbRYWfQwA0c .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GLbgDzbRYWfQwA0c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GLbgDzbRYWfQwA0c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GLbgDzbRYWfQwA0c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GLbgDzbRYWfQwA0c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GLbgDzbRYWfQwA0c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GLbgDzbRYWfQwA0c .marker.cross{stroke:#333333;}#mermaid-svg-GLbgDzbRYWfQwA0c svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GLbgDzbRYWfQwA0c .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GLbgDzbRYWfQwA0c text.actortspan{fill:black;stroke:none;}#mermaid-svg-GLbgDzbRYWfQwA0c .actor-line{stroke:grey;}#mermaid-svg-GLbgDzbRYWfQwA0c .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c .sequenceNumber{fill:white;}#mermaid-svg-GLbgDzbRYWfQwA0c #sequencenumber{fill:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c .messageText{fill:#333;stroke:#333;}#mermaid-svg-GLbgDzbRYWfQwA0c .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GLbgDzbRYWfQwA0c .labelText,#mermaid-svg-GLbgDzbRYWfQwA0c .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-GLbgDzbRYWfQwA0c .loopText,#mermaid-svg-GLbgDzbRYWfQwA0c .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-GLbgDzbRYWfQwA0c .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-GLbgDzbRYWfQwA0c .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-GLbgDzbRYWfQwA0c .noteText,#mermaid-svg-GLbgDzbRYWfQwA0c .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-GLbgDzbRYWfQwA0c .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GLbgDzbRYWfQwA0c .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GLbgDzbRYWfQwA0c .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GLbgDzbRYWfQwA0c .actorPopupMenu{position:absolute;}#mermaid-svg-GLbgDzbRYWfQwA0c .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-GLbgDzbRYWfQwA0c .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GLbgDzbRYWfQwA0c .actor-man circle,#mermaid-svg-GLbgDzbRYWfQwA0c line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-GLbgDzbRYWfQwA0c :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComponentA Mediator ComponentB ComponentC 通知事件X 处理事件X 处理事件X 完成 完成 反馈结果 ComponentA Mediator ComponentB ComponentC 七、中介者模式 vs 其他模式
对比模式核心区别观察者模式单向通知不处理响应外观模式简化子系统接口不处理组件间交互代理模式控制单个对象访问 八、实际框架应用案例
1. Java Message Service (JMS)
classDiagramclass ConnectionFactoryclass Connectionclass Sessionclass MessageProducerclass MessageConsumerConnectionFactory -- Connection : 创建Connection -- Session : 创建Session -- MessageProducer : 创建Session -- MessageConsumer : 创建MessageProducer -- Message : 发送MessageConsumer -- Message : 接收note for ConnectionFactory 作为中介者协调\n生产者与消费者2. Spring框架中的ApplicationContext
Component
class ServiceA {Autowired private ApplicationContext context; // 中介者public void doSomething() {// 通过中介者获取其他组件ServiceB serviceB context.getBean(ServiceB.class);serviceB.process();}
}九、高级应用技巧
1. 中介者分层设计 #mermaid-svg-SRstf0WKi0CFFZ5l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SRstf0WKi0CFFZ5l .error-icon{fill:#552222;}#mermaid-svg-SRstf0WKi0CFFZ5l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SRstf0WKi0CFFZ5l .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-SRstf0WKi0CFFZ5l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SRstf0WKi0CFFZ5l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SRstf0WKi0CFFZ5l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SRstf0WKi0CFFZ5l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SRstf0WKi0CFFZ5l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SRstf0WKi0CFFZ5l .marker.cross{stroke:#333333;}#mermaid-svg-SRstf0WKi0CFFZ5l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SRstf0WKi0CFFZ5l g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-SRstf0WKi0CFFZ5l g.classGroup text .title{font-weight:bolder;}#mermaid-svg-SRstf0WKi0CFFZ5l .nodeLabel,#mermaid-svg-SRstf0WKi0CFFZ5l .edgeLabel{color:#131300;}#mermaid-svg-SRstf0WKi0CFFZ5l .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-SRstf0WKi0CFFZ5l .label text{fill:#131300;}#mermaid-svg-SRstf0WKi0CFFZ5l .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-SRstf0WKi0CFFZ5l .classTitle{font-weight:bolder;}#mermaid-svg-SRstf0WKi0CFFZ5l .node rect,#mermaid-svg-SRstf0WKi0CFFZ5l .node circle,#mermaid-svg-SRstf0WKi0CFFZ5l .node ellipse,#mermaid-svg-SRstf0WKi0CFFZ5l .node polygon,#mermaid-svg-SRstf0WKi0CFFZ5l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SRstf0WKi0CFFZ5l .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-SRstf0WKi0CFFZ5l g.clickable{cursor:pointer;}#mermaid-svg-SRstf0WKi0CFFZ5l g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-SRstf0WKi0CFFZ5l g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-SRstf0WKi0CFFZ5l .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-SRstf0WKi0CFFZ5l .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-SRstf0WKi0CFFZ5l .dashed-line{stroke-dasharray:3;}#mermaid-svg-SRstf0WKi0CFFZ5l #compositionStart,#mermaid-svg-SRstf0WKi0CFFZ5l .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #compositionEnd,#mermaid-svg-SRstf0WKi0CFFZ5l .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #dependencyStart,#mermaid-svg-SRstf0WKi0CFFZ5l .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #dependencyStart,#mermaid-svg-SRstf0WKi0CFFZ5l .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #extensionStart,#mermaid-svg-SRstf0WKi0CFFZ5l .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #extensionEnd,#mermaid-svg-SRstf0WKi0CFFZ5l .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #aggregationStart,#mermaid-svg-SRstf0WKi0CFFZ5l .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l #aggregationEnd,#mermaid-svg-SRstf0WKi0CFFZ5l .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SRstf0WKi0CFFZ5l .edgeTerminals{font-size:11px;}#mermaid-svg-SRstf0WKi0CFFZ5l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 协调 协调 GlobalMediator ModuleAMediator ModuleBMediator ComponentA1 ComponentA2 2. 事件总线简化版
class EventBusMediator {private MapClass?, ListConsumerObject handlers new HashMap();public T void subscribe(ClassT eventType, ConsumerT handler) {handlers.computeIfAbsent(eventType, k - new ArrayList()).add((ConsumerObject) handler);}public void publish(Object event) {ListConsumerObject eventHandlers handlers.get(event.getClass());if (eventHandlers ! null) {eventHandlers.forEach(handler - handler.accept(event));}}
}// 使用示例
EventBusMediator bus new EventBusMediator();
bus.subscribe(String.class, msg - System.out.println(处理字符串: msg));
bus.publish(测试消息);十、常见问题解答
Q1如何避免中介者变成上帝对象
职责拆分创建多个专业中介者如登录中介者、支付中介者使用状态模式让中介者根据状态改变行为结合命令模式将操作封装为命令对象
Q2中介者模式如何支持异步
class AsyncMediator {private Executor executor Executors.newCachedThreadPool();public void mediate(Runnable task) {executor.execute(task);}
}Q3如何处理组件间的双向通信
在中介者中实现回调机制
interface Callback {void onComplete(Object result);
}class ComponentA {void request(Mediator mediator, Callback callback) {mediator.processRequest(this, callback);}
}class Mediator {void processRequest(ComponentA comp, Callback callback) {// 处理请求...callback.onComplete(result);}
}如果你觉得文章对你有帮助的话请帮忙点点关注吧谢谢啦