协调多个对象之间的交互——中介者模式(三):客户信息管理窗口的中介者模式解决方案

撸了今年阿里、腾讯和美团的面试,我有一个重要发现…….

作者:Liuwei-Sunny

出处:https://blog.csdn.net/lovelion


20.3 完整解决方案

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

2019061510090_1.png

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

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

2019061510090_2.png

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

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

    //抽象中介者
    abstract class Mediator {
        public abstract void componentChanged(Component c);
    }

    //具体中介者
    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();
            }
        }
    }

    //抽象组件类:抽象同事类
    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 Button extends Component {
        public void update() {
            //按钮不产生交互
        }
    }

    //列表框类:具体同事类
    class List extends Component {
        public void update() {
            System.out.println("列表框增加一项:张无忌。");
        }

        public void select() {
            System.out.println("列表框选中项:小龙女。");
        }
    }

    //组合框类:具体同事类
    class ComboBox extends Component {
        public void update() {
            System.out.println("组合框增加一项:张无忌。");
        }

        public void select() {
            System.out.println("组合框选中项:小龙女。");
        }
    }

    //文本框类:具体同事类
    class TextBox extends Component {
        public void update() {
            System.out.println("客户信息增加成功后文本框清空。");
        }

        public void setText() {
            System.out.println("文本框显示:小龙女。");
        }
    }

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

    class Client {
        public static void main(String args[]) {
            //定义中介者对象
            ConcreteMediator mediator;
            mediator = new ConcreteMediator();

            //定义同事对象
            Button addBT = new Button();
            List list = new List();
            ComboBox cb = new ComboBox();
            TextBox userNameTB = new TextBox();

            addBT.setMediator(mediator);
            list.setMediator(mediator);
            cb.setMediator(mediator);
            userNameTB.setMediator(mediator);

            mediator.addButton = addBT;
            mediator.list = list;
            mediator.cb = cb;
            mediator.userNameTextBox = userNameTB;

            addBT.changed();
            System.out.println("-----------------------------");
            list.changed();
        }
    }

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

--单击增加按钮--

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

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

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

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

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

组合框选中项:小龙女。

文本框显示:小龙女。
赞(0) 打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。Java 技术驿站 » 协调多个对象之间的交互——中介者模式(三):客户信息管理窗口的中介者模式解决方案
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注【Java 技术驿站】公众号,每天早上 8:10 为你推送一篇技术文章

扫描二维码关注我!


关注【Java 技术驿站】公众号 回复 “VIP”,获取 VIP 地址永久关闭弹出窗口

免费获取资源

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏