当前位置: 首页 > wzjs >正文

发泡机 东莞网站建设免费外链代发平台

发泡机 东莞网站建设,免费外链代发平台,外贸鞋的网站建设,wordpress代购网站主题Java设计模式之中介者模式详解 一、中介者模式核心思想 核心目标:通过中介对象封装一组对象间的交互,将网状的对象关系转变为星型结构。如同机场控制塔协调所有飞机的起降,避免飞机之间直接通信导致的混乱。 二、中介者模式类图(…

Java设计模式之中介者模式详解


一、中介者模式核心思想

核心目标通过中介对象封装一组对象间的交互,将网状的对象关系转变为星型结构。如同机场控制塔协调所有飞机的起降,避免飞机之间直接通信导致的混乱。


二、中介者模式类图(Mermaid)

协调
协调
通信
«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 List<User> 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 收到: 大家好! */}
}

四、模式优缺点分析

✅ 优势

  • 解耦对象关系:组件间无需直接引用
  • 简化交互协议:统一通过中介者通信
  • 集中控制逻辑:交互规则在中介者中维护
  • 减少子类数量:避免为不同交互创建大量子类

❌ 缺点

  • 中介者可能复杂:随着交互增加,中介者可能成为"上帝对象"
  • 性能瓶颈:所有通信经过中介者,可能成为系统瓶颈
  • 过度设计风险:简单交互场景不适用

五、典型应用场景

  1. GUI组件交互:表单验证(输入框、按钮、标签联动)
  2. 聊天系统:群聊消息分发
  3. 航空管制:协调飞机起降
  4. 分布式系统:服务注册与发现(如Eureka)
  5. 工作流引擎:任务节点间的协调
  6. 游戏开发:NPC行为协调

六、Mermaid序列图(交互流程)

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. 中介者分层设计

协调
协调
GlobalMediator
ModuleAMediator
ModuleBMediator
ComponentA1
ComponentA2

2. 事件总线(简化版)

class EventBusMediator {private Map<Class<?>, List<Consumer<Object>>> handlers = new HashMap<>();public <T> void subscribe(Class<T> eventType, Consumer<T> handler) {handlers.computeIfAbsent(eventType, k -> new ArrayList<>()).add((Consumer<Object>) handler);}public void publish(Object event) {List<Consumer<Object>> 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);}
}

如果你觉得文章对你有帮助的话,请帮忙点点关注吧!谢谢啦

http://www.dtcms.com/wzjs/108227.html

相关文章:

  • 移动互联网的终点和归宿是什么seo在线工具
  • 网站页面设计考虑要素bt鹦鹉磁力
  • wordpress让访客停留网上seo研究
  • 果洛电子商务网站建设做营销型网站的公司
  • 鄂尔多斯市建设网站国产长尾关键词拘挖掘
  • 做网站的调查问卷seo现在还有前景吗
  • 网站开发无锡佛山网站建设模板
  • 做淘宝设计能做网站吗抖音营销
  • 使用ecs做主机做淘客网站网络热词作文
  • 杭州制作网站企业网站查询域名入口
  • wordpress中脑图形黄冈seo顾问
  • 济南网站建站推广公司网站优化
  • 天津市工程建设交易网站查汗国数据指数
  • 党风廉政建设平台网站爱站网备案查询
  • 自己做优惠劵网站赚钱吗软文生成器
  • 北京知名网站建设公司排名廊坊网站建设优化
  • jq网站登录记住密码怎么做百度推广营销页
  • 重庆网站建设的意义广告优化师培训
  • 服务型网站有哪些石家庄seo外包公司
  • 企业网站建设遵循的原则磁力宅
  • 电子商务网站的建设与规划书怎么做谷歌推广
  • 无锡梦燕服饰网站谁做的深圳抖音seo
  • behance设计网站入口青岛seo外包公司
  • wordpress adsense integratorseo服务公司招聘
  • 宁夏手机网站建设推广普通话内容50字
  • 网站图片上传功能怎么做二十条优化措施原文
  • 做网站的公司 设计好南京广告宣传公司seo
  • 网站建设营销型号的区别上海好的seo公司
  • 做论文常用网站有哪些优化近义词
  • 哪个网站可以找做软件兼职的安卓在线视频嗅探app