子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于委托的一次实践

Posted on 2006-11-10 14:48  Jason Cui  阅读(787)  评论(3编辑  收藏  举报

先讲一下目前的程序架构:一个比较典型的Web程序,抽取出一个Facade层,处理数据结构到Web层的转换。为了处理显示任务和交互任务,定义了两种动作(ShowAction和DoAction),它们共同继承自Action类。这样就可以通过给Action类添加属性和方法,方便的影响到下级所有的动作,也可以给ShowAction多增加一层继承,给每个模块增加不同的属性,比如每个大的目录都有自己的一个Framework,有自己的Title,Keywords,Description。

另外,为了给某些Action增加一些通用的处理过程,(比如增加页面静态化能力),给Action添加了两个ArrayList,PreProcessActions和AftProcessActions,另外增加了一个ProcessAction类,只有一个方法,Process(Action own),在ShowAction的最终方法被调用之前,先检查这两个List是否为空,如果不是,取出其中的值,转换成ProcessAction,执行其中的Process方法。这样只要给某个ShowAction的这两个ArrayList里面加入不同的ProcessAction,就可以自动的增加ShowAction的功能。一直这样用着,也没有什么问题。

今天突然灵光一闪,感觉用ArrayList来保存Action实在是有些丑陋,这里似乎是相当适合委托的架构了,于是研究了一下,进行了一次改造。

首先删掉了ProcessAction的定义,和两个ArrayList的定义,然后增加两个全局的委托定义:

public delegate void ProcessShowAction(ShowAction action);
public delegate void ProcessDoAction(DoAction action);

然后在ShowAction里面增加两个事件定义:

public event ProcessShowAction OnBeginAction;
public event ProcessShowAction OnEndAction;

同样的,在DoAction里也增加两个事件定义。然后真正的处理方法放在哪里?因为静态化处理是被许多动作使用的,所以只能定义了一个空的类,实现两个静态方法,取静态内容和写静态内容。

public class StaticPageProcessor

public static void GetStaticPageContent(ShowAction own)
{

}
public static string GetFileContent(ShowAction own, int time)
{

}
}


然后,将原来给所有的ShowAction的ArrayList里添加ProcessAction的代码改成添加事件的代码:

this.OnBeginAction += new ProcessShowAction(StaticPageProcessor.GetStaticPageContent);

只要有这句话,这个Action自己就可以处理自己的静态化内容了。该方式实现起来更为优雅,而且似乎效率也更好一些。

目前没有读过大的程序代码,因此很多方法都是自己琢磨出来的,看来读代码真的是很有用啊,改天好好研究一下.Text的代码。