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

20.3 完整解决方案

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

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

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

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

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

  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.  

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

  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

原文地址:https://www.cnblogs.com/luckForever/p/7254858.html