长治个人做网站,wordpress 百家模板,销售流程八个步骤,网页设计制作心得中介者模式#xff1a;解耦对象间复杂交互的设计模式
一、模式核心#xff1a;用中介者统一管理对象交互#xff0c;避免两两直接依赖
当系统中多个对象之间存在复杂的网状交互时#xff08;如 GUI 界面中按钮、文本框、下拉框的联动#xff09;#xff0c;对象间直接调…中介者模式解耦对象间复杂交互的设计模式
一、模式核心用中介者统一管理对象交互避免两两直接依赖
当系统中多个对象之间存在复杂的网状交互时如 GUI 界面中按钮、文本框、下拉框的联动对象间直接调用会导致关系混乱、难以维护。
中介者模式Mediator Pattern 通过引入一个中介者对象Mediator将对象间的直接交互转换为与中介者的单向交互。所有对象只需与中介者通信由中介者协调处理交互逻辑从而实现对象间的松耦合。核心解决
交互复杂性避免对象间形成复杂的依赖网络降低系统复杂度。可维护性交互逻辑集中在中介者中修改时只需调整中介者无需修改多个对象。扩展性新增对象时只需实现与中介者的交互不影响现有对象间的逻辑。
核心思想与 UML 类图
中介者模式包含以下角色
中介者接口Mediator定义对象间交互的接口如接收消息、分发消息。具体中介者Concrete Mediator实现中介者接口协调具体同事对象的交互。同事类Colleague依赖中介者通过中介者间接交互不直接调用其他同事。 二、核心实现GUI 界面组件的交互协调
1. 定义中介者接口
public interface Mediator { void notify(Object sender, String event); // 接收消息发送者、事件类型
} 2. 实现具体中介者处理组件联动
public class UIMediator implements Mediator { private Button button; private TextBox textBox; private Dropdown dropdown; // 设置中介者关联的组件 public void setButton(Button button) { this.button button; } public void setTextBox(TextBox textBox) { this.textBox textBox; } public void setDropdown(Dropdown dropdown) { this.dropdown dropdown; } Override public void notify(Object sender, String event) { if (sender button click.equals(event)) { // 按钮点击时获取文本框内容并更新下拉框 String text textBox.getText(); dropdown.setSelectedItem(text); System.out.println(按钮点击设置下拉框选项为 text); } else if (sender dropdown select.equals(event)) { // 下拉框选择时清空文本框 textBox.clear(); System.out.println(下拉框选择清空文本框); } }
} 3. 定义抽象同事类组件基类
public abstract class UIComponent { protected Mediator mediator; public void setMediator(Mediator mediator) { this.mediator mediator; } protected void sendEvent(String event) { if (mediator ! null) { mediator.notify(this, event); // 通过中介者发送事件 } }
} 4. 实现具体同事类按钮、文本框、下拉框
按钮组件
public class Button extends UIComponent { public void onClick() { System.out.println(按钮被点击); sendEvent(click); // 发送点击事件给中介者 }
} 文本框组件
public class TextBox extends UIComponent { private String text; public String getText() { return text; } public void setText(String text) { this.text text; } public void clear() { text ; System.out.println(文本框已清空); }
} 下拉框组件
public class Dropdown extends UIComponent { private String selectedItem; public void setSelectedItem(String item) { this.selectedItem item; System.out.println(下拉框选中 selectedItem); }
} 5. 客户端初始化中介者与组件
public class ClientDemo { public static void main(String[] args) { // 创建中介者和组件 UIMediator mediator new UIMediator(); Button button new Button(); TextBox textBox new TextBox(); Dropdown dropdown new Dropdown(); // 组件关联中介者 button.setMediator(mediator); textBox.setMediator(mediator); dropdown.setMediator(mediator); // 中介者关联组件双向绑定 mediator.setButton(button); mediator.setTextBox(textBox); mediator.setDropdown(dropdown); // 模拟用户操作文本框输入内容按钮点击触发联动 textBox.setText(Option A); button.onClick(); // 按钮点击通过中介者更新下拉框 System.out.println(\n模拟下拉框选择操作); mediator.notify(dropdown, select); // 下拉框选择通过中介者清空文本框 }
} 输出结果
按钮被点击
按钮点击设置下拉框选项为 Option A
下拉框选中Option A 模拟下拉框选择操作
下拉框选择清空文本框
文本框已清空 三、框架与源码中的中介者实践
1. Spring MVC 的 Controller 作为中介者
在 Spring MVC 中Controller 作为中介者协调 Model 和 View 的交互
View如 JSP发送请求到 Controller。Controller 调用 Model 处理业务逻辑再将结果返回给 View。
Controller
public class UserController { Autowired private UserService userService; // Model 层 GetMapping(/user/{id}) public String getUser(PathVariable int id, Model model) { User user userService.getUser(id); model.addAttribute(user, user); // 中介者传递数据到 View return user.jsp; // 中介者决定返回视图 }
} 2. Android 的 Activity 作为中介者
Android 中 Activity 作为中介者管理界面组件Button、EditText 等的交互
组件通过 setOnClickListener 注册事件到 Activity。Activity 处理事件并协调组件状态更新。
public class MainActivity extends AppCompatActivity { private EditText editText; private TextView textView; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText findViewById(R.id.edit_text); textView findViewById(R.id.text_view); findViewById(R.id.button).setOnClickListener(v - { String text editText.getText().toString(); textView.setText(输入内容 text); // 中介者协调组件交互 }); }
} 3. Java Swing 的 Event Dispatch Thread
Swing 通过事件分发线程中介者处理组件事件避免组件间直接通信
按钮点击事件由 Event Dispatch Thread 接收并分发给注册的监听器。
四、避坑指南正确使用中介者模式的 3 个要点
1. 避免中介者过度复杂
若中介者承担过多职责会形成 “上帝对象”。可将中介者拆分为多个专用中介者如订单中介者、支付中介者或引入分层结构如中介者 协调者。
2. 平衡中介者与同事的职责
同事类应尽量保持简单仅包含自身状态和基本操作复杂逻辑集中在中介者中。若同事类需要频繁调用中介者需检查是否违反单一职责原则。
3. 区分中介者模式与观察者模式
中介者模式对象间通过中介者间接交互形成星型结构非广播式。观察者模式主题与观察者是一对多的依赖关系观察者被动接收通知广播式。
六、总结何时该用中介者模式
适用场景核心特征典型案例对象间网状交互多个对象间存在复杂直接调用GUI 界面组件联动、分布式系统节点通信系统重构解耦遗留系统中对象间紧耦合需简化依赖微服务间消息路由、legacy 系统改造集中式逻辑管理需要将交互逻辑集中管理与维护工作流引擎、交易系统规则引擎
中介者模式通过 “中心化管理” 的设计有效降低了对象间的耦合度提升了系统的可维护性和扩展性。下一篇我们将探讨访问者模式解析如何分离数据结构与操作敬请期待
扩展思考中介者模式的缺点
中介者单点风险中介者故障会导致整个系统交互失效需通过冗余设计或分布式中介者缓解。调试难度增加交互逻辑集中在中介者中需借助日志或调试工具追踪消息流程。