接收者、执行者、答复者模式

在软件设计中我们经常碰到这样的案例,一个界面接受用户的操作事件,在另外一个界面中回复或响应用户的操作结果。在一般情况下,我们总是把接受事件、答复结果以及其中的执行逻辑堆积在一处。这样的结果就是系统条理不清,功能紊乱,不利于系统的升级和维护。
现本人根据实际经验把接受事件、执行逻辑和答复结果以类的形式按功能给予划分,它们之间以事件委托的形式进行联系。以一个最简单的事例来说明如何进行模块的划分和功能的实现。(此事例的作用为接收用户输入的名字,返回对应此名字的用户地址。)
对用户输入的信息进行封装,成为一个信息事件参数类,如下:
//接收信息事件参数类
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();
}
好了,代码测试正确。总结如下:
根据业务逻辑的把“一个事件及事件引起的结果”按照功能进行划分,各个功能模块具体实现自己模块事务。然后通过委托的形式把各模块连接起来实现信息的传递。
posted @ 2007-05-18 17:32  寒江独钓客  阅读(193)  评论(0编辑  收藏  举报