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

20.3 完整解决方案

      为了协调界面组件对象之间的复杂交互关系,Sunny公司开发人员使用中介者模式来设计客户信息管理窗口,其结构示意图如图20-7所示:

20-7 引入了中介者类的“客户信息管理窗口”结构示意图

      20-7只是一个重构之后的结构示意图,在具体实现时,为了确保系统具有更好的灵活性和可扩展性,我们需要定义抽象中介者和抽象组件类,其中抽象组件类是所有具体组件类的公共父类,完整类图如图20-8所示:

20-8 重构后的“客户信息管理窗口”结构图

      在图20-8中,Component充当抽象同事类,ButtonListComboBoxTextBox充当具体同事类,Mediator充当抽象中介者类,ConcreteMediator充当具体中介者类,ConcreteMediator维持了对具体同事类的引用,为了简化ConcreteMediator类的代码,我们在其中只定义了一个Button对象和一个TextBox对象。完整代码如下所示:

[java]  view plain copy
  1. //抽象中介者  
  2. abstract class Mediator {  
  3.     public abstract void componentChanged(Component c);  
  4. }  
  5.   
  6. //具体中介者  
  7. class ConcreteMediator extends Mediator {  
  8.     //维持对各个同事对象的引用  
  9.     public Button addButton;  
  10.     public List list;  
  11.     public TextBox userNameTextBox;  
  12.     public ComboBox cb;  
  13.   
  14.     //封装同事对象之间的交互  
  15.     public void componentChanged(Component c) {  
  16.         //单击按钮  
  17. if(c == addButton) {  
  18.             System.out.println("--单击增加按钮--");  
  19.             list.update();  
  20.             cb.update();  
  21.             userNameTextBox.update();  
  22.         }  
  23.         //从列表框选择客户  
  24.         else if(c == list) {  
  25.             System.out.println("--从列表框选择客户--");  
  26.             cb.select();  
  27.             userNameTextBox.setText();  
  28.         }  
  29.         //从组合框选择客户  
  30.         else if(c == cb) {  
  31.             System.out.println("--从组合框选择客户--");  
  32.             cb.select();  
  33.             userNameTextBox.setText();  
  34.         }  
  35.     }  
  36. }  
  37.   
  38. //抽象组件类:抽象同事类  
  39. abstract class Component {  
  40.     protected Mediator mediator;  
  41.       
  42.     public void setMediator(Mediator mediator) {  
  43.         this.mediator = mediator;  
  44.     }  
  45.   
  46.     //转发调用  
  47.     public void changed() {  
  48.         mediator.componentChanged(this);  
  49.     }  
  50.       
  51.     public abstract void update();    
  52. }  
  53.   
  54. //按钮类:具体同事类  
  55. class Button extends Component {  
  56.     public void update() {  
  57.         //按钮不产生交互  
  58.     }  
  59. }  
  60.   
  61. //列表框类:具体同事类  
  62. class List extends Component {  
  63.     public void update() {  
  64.         System.out.println("列表框增加一项:张无忌。");  
  65.     }  
  66.       
  67.     public void select() {  
  68.         System.out.println("列表框选中项:小龙女。");  
  69.     }  
  70. }  
  71.   
  72. //组合框类:具体同事类  
  73. class ComboBox extends Component {  
  74.     public void update() {  
  75.         System.out.println("组合框增加一项:张无忌。");  
  76.     }  
  77.       
  78.     public void select() {  
  79.         System.out.println("组合框选中项:小龙女。");  
  80.     }  
  81. }  
  82.   
  83. //文本框类:具体同事类  
  84. class TextBox extends Component {  
  85.     public void update() {  
  86.         System.out.println("客户信息增加成功后文本框清空。");  
  87.     }  
  88.       
  89.     public void setText() {  
  90.         System.out.println("文本框显示:小龙女。");  
  91.     }  
  92. }  

      编写如下客户端测试代码:

[java]  view plain copy
  1. class Client {  
  2.     public static void main(String args[]) {  
  3.         //定义中介者对象  
  4.         ConcreteMediator mediator;  
  5.         mediator = new ConcreteMediator();  
  6.           
  7.         //定义同事对象  
  8.         Button addBT = new Button();  
  9.         List list = new List();  
  10.         ComboBox cb = new ComboBox();  
  11.         TextBox userNameTB = new TextBox();  
  12.   
  13.         addBT.setMediator(mediator);  
  14.         list.setMediator(mediator);  
  15.         cb.setMediator(mediator);  
  16.         userNameTB.setMediator(mediator);  
  17.   
  18.         mediator.addButton = addBT;  
  19.         mediator.list = list;  
  20.         mediator.cb = cb;  
  21.         mediator.userNameTextBox = userNameTB;  
  22.           
  23.         addBT.changed();  
  24.         System.out.println("-----------------------------");  
  25.         list.changed();  
  26.     }  
  27. }  

      编译并运行程序,输出结果如下:

--单击增加按钮--

列表框增加一项:张无忌。

组合框增加一项:张无忌。

客户信息增加成功后文本框清空。

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

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

组合框选中项:小龙女。

文本框显示:小龙女。


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

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值