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