软件设计模式与体系结构 实验十二 中介者模式
【实验内容和要求】
某软件公司要开发一套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)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。