软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式

【实验内容和要求】
某软件公司要开发一套CRM系统,其中包含一个客户信息管理模块,所设计的“客户信息管理窗口”界面效果图如下图所示:
软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式
文章图片

软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式
文章图片

用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。
一、实验目的:
1) 掌握中介者模式(Mediator)的特点
2) 分析具体问题,使用中介者模式进行设计。

二、实验环境:
Eclipse

三、实验内容:
【软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式】【模式UML图】
软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式
文章图片

【模式代码(JAVA语言实现)】

//抽象中介者 abstract class Mediator { public abstract void componentChanged(Component c); }//按钮类:具体同事类 class Button extends Component { public void update() { //按钮不产生交互 } }//组合框类:具体同事类 class ComboBox extends Component { public void update() { System.out.println("组合框增加一项:张无忌。"); } public void select() { System.out.println("组合框选中项:小龙女。"); } }//抽象组件类:抽象同事类 abstract class Component { protected Mediator mediator; public void setMediator(Mediator mediator) { this.mediator = mediator; } //转发调用 public void changed() { mediator.componentChanged(this); } public abstract void update(); } //具体中介者 class ConcreteMediator extends Mediator {// 维持对各个同事对象的引用public Button addButton; public List list; public TextBox userNameTextBox; public ComboBox cb; // 封装同事对象之间的交互public void componentChanged(Component c) {// 单击按钮if (c == addButton) {System.out.println("--单击增加按钮--"); list.update(); cb.update(); userNameTextBox.update(); }// 从列表框选择客户else if (c == list) {System.out.println("--从列表框选择客户--"); cb.select(); userNameTextBox.setText(); }// 从组合框选择客户else if (c == cb) {System.out.println("--从组合框选择客户--"); cb.select(); userNameTextBox.setText(); }}}//文本标签类:具体同事类 class Label extends Component { public void update() { System.out.println("文本标签内容改变,客户信息总数加1。"); } }//列表框类:具体同事类 class List extends Component { public void update() { System.out.println("列表框增加一项:张无忌。"); } public void select() { System.out.println("列表框选中项:小龙女。"); } }//新增具体中介者类 class SubConcreteMediator extends ConcreteMediator {// 增加对Label对象的引用public Label label; public void componentChanged(Component c) {// 单击按钮if (c == addButton) {System.out.println("--单击增加按钮--"); list.update(); cb.update(); userNameTextBox.update(); label.update(); // 文本标签更新}// 从列表框选择客户else if (c == list) {System.out.println("--从列表框选择客户--"); cb.select(); userNameTextBox.setText(); }// 从组合框选择客户else if (c == cb) {System.out.println("--从组合框选择客户--"); cb.select(); userNameTextBox.setText(); }}}//文本框类:具体同事类 class TextBox extends Component { public void update() { System.out.println("客户信息增加成功后文本框清空。"); } public void setText() { System.out.println("文本框显示:小龙女。"); } }class Client { public static void main(String args[]) { //用新增具体中介者定义中介者对象 SubConcreteMediator mediator; mediator = new SubConcreteMediator(); Button addBT = new Button(); List list = new List(); ComboBox cb = new ComboBox(); TextBox userNameTB = new TextBox(); Label label = new Label(); addBT.setMediator(mediator); list.setMediator(mediator); cb.setMediator(mediator); userNameTB.setMediator(mediator); label.setMediator(mediator); mediator.addButton = addBT; mediator.list = list; mediator.cb = cb; mediator.userNameTextBox = userNameTB; mediator.label = label; addBT.changed(); System.out.println("-----------------------------"); list.changed(); } }

【运行截图】
软件设计模式与体系结构|软件设计模式与体系结构 实验十二 中介者模式
文章图片


四、心得体会:
中介者模式主要适用于以下情况:
1) 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
2) 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
3)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。

    推荐阅读