协调多个对象之间的交互——中介者模式(四)
2017-12-03 16:37
295 查看
20.4 中介者与同事类的扩展
Sunny软件公司CRM系统的客户对“客户信息管理窗口”提出了一个修改意见:要求在窗口的下端能够及时显示当前系统中客户信息的总数。修改之后的界面如图20-9所示:图20-9 修改之后的“客户信息管理窗口”界面图
从图20-9中我们不难发现,可以通过增加一个文本标签(Label)来显示客户信息总数,而且当用户点击“增加”按钮或者“删除”按钮时,将改变文本标签的内容。
由于使用了中介者模式,在原有系统中增加新的组件(即新的同事类)将变得很容易,我们至少有如下两种解决方案:
【解决方案一】增加一个界面组件类Label,修改原有的具体中介者类ConcreteMediator,增加一个对Label对象的引用,然后修改componentChanged()方法中其他相关组件对象的业务处理代码,原有组件类无须任何修改,客户端代码也需针对新增组件Label进行适当修改。
【解决方案二】与方案一相同,首先增加一个Label类,但不修改原有具体中介者类ConcreteMediator的代码,而是增加一个ConcreteMediator的子类SubConcreteMediator来实现对Label对象的引用,然后在新增的中介者类SubConcreteMediator中通过覆盖componentChanged()方法来实现所有组件(包括新增Label组件)之间的交互,同样,原有组件类无须做任何修改,客户端代码需少许修改。
引入Label之后“客户信息管理窗口”类结构示意图如图20-10所示:
图20-10 增加Label组件类后的“客户信息管理窗口”结构示意图
由于【解决方案二】无须修改ConcreteMediator类,更符合“开闭原则”,因此我们选择该解决方案来对新增Label类进行处理,对应的完整类图如图20-11所示:
图20-11 修改之后的“客户信息管理窗口”结构图
在图20-11中,新增了具体同事类Label和具体中介者类SubConcreteMediator,代码如下所示:
//文本标签类:具体同事类
class Label extends Component {
public void update() {
System.out.println("文本标签内容改变,客户信息总数加1。");
}
}
//新增具体中介者类
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 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。 ----------------------------- --从列表框选择客户-- 组合框选中项:小龙女。 文本框显示:小龙女。 |
|
【作者:
af67
刘伟 http://blog.csdn.net/lovelion】
相关文章推荐
- 协调多个对象之间的交互——中介者模式(一)
- 协调多个对象之间的交互——中介者模式(五)
- 协调多个对象之间的交互——中介者模式
- 协调多个对象之间的交互——中介者模式(二)
- 协调多个对象之间的交互——中介者模式(一)
- 协调多个对象之间的交互——中介者模式(二)
- 协调多个对象之间的交互——中介者模式(三)
- 协调多个对象之间的交互——中介者模式(二)
- 协调多个对象之间的交互——中介者模式
- 协调多个对象之间的交互——中介者模式(三)
- 协调多个对象之间的交互——中介者模式(四)
- 协调多个对象之间的交互——中介者模式(三)
- 协调多个对象之间的交互——中介者模式(四)
- 协调多个对象之间的交互——中介者模式
- 协调多个对象之间的交互——中介者模式(五)
- 协调多个对象之间的交互——中介者模式(五)
- 协调多个对象之间的交互——中介者模式(Mediator Pattern)
- 协调多个对象之间的交互——中介者模式(一)
- Mediator 用一个中介者对象来封装一系列的对象交互。中介者使各个对象不需要显式的相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)