首页 > 代码库 > 设计模式之中介者模式

设计模式之中介者模式

技术分享

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

通过分析发现,在上图中,界面组件之间存在较为复杂的交互关系:如果删除一个客户,将从客户列表(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、 结果及分析,编译并运行程序,输出结果如下:

技术分享

 

设计模式之中介者模式