接收者、执行者、答复者模式
在软件设计中我们经常碰到这样的案例,一个界面接受用户的操作事件,在另外一个界面中回复或响应用户的操作结果。在一般情况下,我们总是把接受事件、答复结果以及其中的执行逻辑堆积在一处。这样的结果就是系统条理不清,功能紊乱,不利于系统的升级和维护。
现本人根据实际经验把接受事件、执行逻辑和答复结果以类的形式按功能给予划分,它们之间以事件委托的形式进行联系。以一个最简单的事例来说明如何进行模块的划分和功能的实现。(此事例的作用为接收用户输入的名字,返回对应此名字的用户地址。)
对用户输入的信息进行封装,成为一个信息事件参数类,如下:
//接收信息事件参数类
public class RequestEventArgs
{
//名字
private string name;
public RequestEventArgs(string name)
{
this.name = name;
}
public string Name
{
get{return this.name;}
}
}
//定义接收委托类型
public delegate void RequestEventHandle(RequestEventArgs e);
定义完接收信息参数类和接收委托类后,定义接收用户输入的信息的接收类,其中只开放一个用户输入接收。
public class Request
{
//接收委托类型的事件
private event RequestEventHandle OnRequest;
//事件属性
public RequestEventHandle RequestEvent
{
get{return this.OnRequest;}
set{this.OnRequest = value;}
}
//接收者接口,用来接收用户输入的信息
public void Run(string name)
{
this.OnRequest(new RequestEventArgs(name));
}
}
定义完接收者类后,程序必须根据用户输入的信息做出一定的逻辑处理,这是执行者类所具备的功能。在逻辑处理完后当然有会有传递给答复者类的回复信息,也把它以答复事件信息类的形式表示,如下:
//答复事件信息类
public class ResponseEventArgs
{
//地址
private string address;
public ResponseEventArgs(string address)
{
this.address = address;
}
public string Address
{
get{return this.address;}
}
}
//定义答复委托类型
public delegate void ResponseEventHandle(ResponseEventArgs e);
接下来定义执行者类,执行者根据从接收事件信息类中的信息,也就是名字,根据一定的业务逻辑来得到对应的地址,可以从数据库等,这里以最简单的形式给出,如下:
public class Executor
{
//答复委托类型的事件
private event ResponseEventHandle OnResponse;
//通过构造函数直接设置接收者类中的接收事件对象
public Executor(Request request)
{
request.RequestEvent = new RequestEventHandle(this.DoRequestHandle);
}
public ResponseEventHandle ResponseEvent
{
get{return this.OnResponse;}
set{this.OnResponse = value;}
}
//根据接收事件信息类中的信息,具体的业务逻辑执行函数,这里以最简单的形式给出
protected void DoRequestHandle(RequestEventArgs e)
{
this.OnResponse(new ResponseEventArgs(string.Format("Name:{0},Address:{1}",e.Name,"hangzhou"));
}
}
在处理完业务逻辑后,必须对用户所输入的信息进行响应,答复者类就是这个功能。它以一个输出接口来实现对用户的答复。如下:
public class Response
{
//通过构造函数直接设置执行者类中的具体答复事件
public Response(Executor executor)
{
executor.ResponseEvent = new ResponseEventHandle(this.Show);
}
//对外答复接口
public void Show(ResponseEventArgs e)
{
Console.WriteLine(e.Address);
}
}
事例中答复者类只是简单的以控制台的形式显示答复信息,但是在具体的程序设计中我们可以用窗体或其他各种控件来套用,表示改变窗体背景色、窗体大小位置等等,具体的应用根据不同的用户输入而不同。
最后一步就是对以上接收者、执行者、答复者来个简单的测试,如下:
static void Main(string[] args)
{
Console.Write("Input your name:";
string name = Console.ReadLine();
Request request = new Request();
Executor executor = new Executor(request);
Response response = new Response(executor);
request.Run(name);
Console.ReadLine();
}
好了,代码测试正确。总结如下:
根据业务逻辑的把“一个事件及事件引起的结果”按照功能进行划分,各个功能模块具体实现自己模块事务。然后通过委托的形式把各模块连接起来实现信息的传递。
现本人根据实际经验把接受事件、执行逻辑和答复结果以类的形式按功能给予划分,它们之间以事件委托的形式进行联系。以一个最简单的事例来说明如何进行模块的划分和功能的实现。(此事例的作用为接收用户输入的名字,返回对应此名字的用户地址。)
对用户输入的信息进行封装,成为一个信息事件参数类,如下:
//接收信息事件参数类
public class RequestEventArgs
{
//名字
private string name;
public RequestEventArgs(string name)
{
this.name = name;
}
public string Name
{
get{return this.name;}
}
}
//定义接收委托类型
public delegate void RequestEventHandle(RequestEventArgs e);
定义完接收信息参数类和接收委托类后,定义接收用户输入的信息的接收类,其中只开放一个用户输入接收。
public class Request
{
//接收委托类型的事件
private event RequestEventHandle OnRequest;
//事件属性
public RequestEventHandle RequestEvent
{
get{return this.OnRequest;}
set{this.OnRequest = value;}
}
//接收者接口,用来接收用户输入的信息
public void Run(string name)
{
this.OnRequest(new RequestEventArgs(name));
}
}
定义完接收者类后,程序必须根据用户输入的信息做出一定的逻辑处理,这是执行者类所具备的功能。在逻辑处理完后当然有会有传递给答复者类的回复信息,也把它以答复事件信息类的形式表示,如下:
//答复事件信息类
public class ResponseEventArgs
{
//地址
private string address;
public ResponseEventArgs(string address)
{
this.address = address;
}
public string Address
{
get{return this.address;}
}
}
//定义答复委托类型
public delegate void ResponseEventHandle(ResponseEventArgs e);
接下来定义执行者类,执行者根据从接收事件信息类中的信息,也就是名字,根据一定的业务逻辑来得到对应的地址,可以从数据库等,这里以最简单的形式给出,如下:
public class Executor
{
//答复委托类型的事件
private event ResponseEventHandle OnResponse;
//通过构造函数直接设置接收者类中的接收事件对象
public Executor(Request request)
{
request.RequestEvent = new RequestEventHandle(this.DoRequestHandle);
}
public ResponseEventHandle ResponseEvent
{
get{return this.OnResponse;}
set{this.OnResponse = value;}
}
//根据接收事件信息类中的信息,具体的业务逻辑执行函数,这里以最简单的形式给出
protected void DoRequestHandle(RequestEventArgs e)
{
this.OnResponse(new ResponseEventArgs(string.Format("Name:{0},Address:{1}",e.Name,"hangzhou"));
}
}
在处理完业务逻辑后,必须对用户所输入的信息进行响应,答复者类就是这个功能。它以一个输出接口来实现对用户的答复。如下:
public class Response
{
//通过构造函数直接设置执行者类中的具体答复事件
public Response(Executor executor)
{
executor.ResponseEvent = new ResponseEventHandle(this.Show);
}
//对外答复接口
public void Show(ResponseEventArgs e)
{
Console.WriteLine(e.Address);
}
}
事例中答复者类只是简单的以控制台的形式显示答复信息,但是在具体的程序设计中我们可以用窗体或其他各种控件来套用,表示改变窗体背景色、窗体大小位置等等,具体的应用根据不同的用户输入而不同。
最后一步就是对以上接收者、执行者、答复者来个简单的测试,如下:
static void Main(string[] args)
{
Console.Write("Input your name:";
string name = Console.ReadLine();
Request request = new Request();
Executor executor = new Executor(request);
Response response = new Response(executor);
request.Run(name);
Console.ReadLine();
}
好了,代码测试正确。总结如下:
根据业务逻辑的把“一个事件及事件引起的结果”按照功能进行划分,各个功能模块具体实现自己模块事务。然后通过委托的形式把各模块连接起来实现信息的传递。