协调多个对象之间的交互——中介者模式(四)

194 篇文章 12 订阅
189 篇文章 394 订阅

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

-----------------------------

--从列表框选择客户--

组合框选中项:小龙女。

文本框显示:小龙女。

       由于在本实例中不同的组件类(即不同的同事类)所拥有的方法并不完全相同,因此中介者类没有针对抽象同事类编程,导致在具体中介者类中需要维持对具体同事类的引用,客户端代码无法完全透明地对待所有同事类和中介者类。在某些情况下,如果设计得当,可以在客户端透明地对同事类和中介者类编程,这样系统将具有更好的灵活性和可扩展性。

疑问

思考

如果不使用中介者模式,按照图20-3所示设计方案,增加新组件时原有系统该如何修改?

       在中介者模式的实际使用过程中,如果需要引入新的具体同事类,只需要继承抽象同事类并实现其中的方法即可,由于具体同事类之间并无直接的引用关系,因此原有所有同事类无须进行任何修改,它们与新增同事对象之间的交互可以通过修改或者增加具体中介者类来实现如果需要在原有系统中增加新的具体中介者类,只需要继承抽象中介者类(或已有的具体中介者类)并覆盖其中定义的方法即可,在新的具体中介者中可以通过不同的方式来处理对象之间的交互,也可以增加对新增同事的引用和调用。在客户端中只需要修改少许代码(如果引入配置文件的话有时可以不修改任何代码)就可以实现中介者的更换。


【作者:刘伟 http://blog.csdn.net/lovelion

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在多线程编程中,中介者模式可以用于协调和管理不同线程之间的通信和交互中介者模式通过引入一个中介对象来减少线程之间的直接依赖,从而提高代码的可维护性和扩展性。 中介者模式的核心思想是,将各个线程之间的通信逻辑封装到一个中介者对象中,线程可以通过与中介者对象进行交互,而不需要了解其他线程的具体实现细节。中介者对象负责处理线程之间的消息传递、协调和同步操作。 下面是一个简单的示例代码,演示了如何在多线程程序中使用中介者模式: ```python import threading class Mediator: def __init__(self): self.thread_a = ThreadA(self) self.thread_b = ThreadB(self) def start(self): self.thread_a.start() self.thread_b.start() def send_message_from_a_to_b(self, message): self.thread_b.receive_message(message) def send_message_from_b_to_a(self, message): self.thread_a.receive_message(message) class ThreadA(threading.Thread): def __init__(self, mediator): super().__init__() self.mediator = mediator def run(self): # 线程A执行的逻辑 message = "Hello from Thread A" self.mediator.send_message_from_a_to_b(message) def receive_message(self, message): print("Thread A received:", message) class ThreadB(threading.Thread): def __init__(self, mediator): super().__init__() self.mediator = mediator def run(self): # 线程B执行的逻辑 message = "Hello from Thread B" self.mediator.send_message_from_b_to_a(message) def receive_message(self, message): print("Thread B received:", message) # 主线程作为中介者 mediator = Mediator() # 启动线程 mediator.start() ``` 在上述示例中,Mediator类充当中介者对象,它拥有两个线程对象thread_a和thread_b。线程A和线程B都持有对中介者对象的引用,并通过调用中介者对象的方法来进行通信。 当线程A运行时,它会将消息发送给中介者对象,中介者对象再将消息传递给线程B。线程B收到消息后打印出来。同样地,当线程B运行时,它也会将消息发送给中介者对象,中介者对象再将消息传递给线程A。 使用中介者模式可以很好地解耦多线程程序中的各个线程,提高代码的可维护性和可扩展性。同时,中介者模式也可以帮助我们管理线程之间的同步问题,确保线程之间的顺序和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值