zoukankan      html  css  js  c++  java
  • 设计模式之中介者模式

    客户信息管理窗口”界面效果图

    通过分析发现,在上图中,界面组件之间存在较为复杂的交互关系:如果删除一个客户,将从客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中的客户名称也将减少一个;如果增加一个客户信息,则客户列表中将增加一个客户,且组合框中也将增加一项。

    为了更好地处理界面组件之间的交互,现使用中介者模式设计该系统

    1、类图

     中介者模式结构:

    实例

    2、创建项目

    ………………………………

    3、 Mediator:抽象中介者类。

    namespace MediatorSample

    {

        abstract class Mediator

        {

            public abstract void ComponentChanged(Component c);

        }

    }

    4、 ConcreteMediator:具体中介者类。

    using System;

    namespace MediatorSample

    {

        class ConcreteMediator : Mediator

        {

            //维持对各个同事对象的引用

            public Button addButton;

            public List list;

            public TextBox userNameTextBox;

            public ComboBox cb;

            //封装同事对象之间的交互

            public override void ComponentChanged(Component c)

            {

        //单击按钮

                if (c == addButton)

                {

        Console.WriteLine("--单击增加按钮--");

        list.Update();

        cb.Update();

        userNameTextBox.Update();

        }

                //从列表框选择客户

        else if (c == list)

                {

        Console.WriteLine("--从列表框选择客户--");

        cb.Select();

        userNameTextBox.SetText();

        }

                //从组合框选择客户

        else if (c == cb)

                {

        Console.WriteLine("--从组合框选择客户--");

        cb.Select();

        userNameTextBox.SetText();

        }

        }

        }

    }

    5、 Component:抽象组件类,充当抽象同事类。

    namespace MediatorSample

    {

        abstract class Component

        {

            protected Mediator mediator;

            public void SetMediator(Mediator mediator)

            {

                this.mediator = mediator;

            }

            //转发调用

            public void Changed()

            {

                mediator.ComponentChanged(this);

            }

            public abstract void Update();

        }

    }

    6、 Button:按钮类,充当具体同事类。

    namespace MediatorSample

    {

        class Button : Component

        {

        public override void Update()

            {

        //按钮不产生响应

        }

        }

    }

    7、 List:列表框类,充当具体同事类。

    using System;

    namespace MediatorSample

    {

        class List : Component

        {

            public override void Update()

            {

        Console.WriteLine("列表框增加一项:张无忌。");

        }

            public void Select()

            {

                Console.WriteLine("列表框选中项:小龙女。");

        }

        }

    }

    8、 ComboBox:组合框类,充当具体同事类。

    using System;

    namespace MediatorSample

    {

        class ComboBox : Component

        {

        public override void Update()

            {

        Console.WriteLine("组合框增加一项:张无忌。");

        }

        public void Select()

            {

                Console.WriteLine("组合框选中项:小龙女。");

        }

        }

    }

    9、 TextBox:文本框类,充当具体同事类。

    using System;

    namespace MediatorSample

    {

        class TextBox : Component

        {

        public override void Update()

            {

        Console.WriteLine("客户信息增加成功后文本框清空。");

        }

        public void SetText()

            {

        Console.WriteLine("文本框显示:小龙女。");

        }

        }

    }

    10、 Program:客户端测试类。

    using System;

    namespace MediatorSample

    {

        class Program

        {

            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();

        Console.WriteLine("-----------------------------");

        list.Changed();

                */

                

                //用新增具体中介者定义中介者对象

        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();

        Console.WriteLine("-----------------------------");

        list.Changed();

                Console.Read();

            }

        }

    }

    11、 结果及分析,编译并运行程序,输出结果如下:

  • 相关阅读:
    使用非ServiceDependency方法获得模块中已注册的服务
    一个比较有效的存储过程命名规则
    SQL重复记录查询
    Redis命令行启动,修改密码
    springboot+dubbo后端打包成jar并运行
    开发问题:NOAUTH Authentication required
    @Api报错
    String的indexof使用
    开发报错:init datasource error, url: jdbc:mysql://localhost:3306/book(初始化数据库错误)
    开发问题:异常Required request body is missing
  • 原文地址:https://www.cnblogs.com/cqxhl/p/6097448.html
Copyright © 2011-2022 走看看