先讲一下目前的程序架构:一个比较典型的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 static void GetStaticPageContent(ShowAction own)
{
}
public static string GetFileContent(ShowAction own, int time)
{
}
}
然后,将原来给所有的ShowAction的ArrayList里添加ProcessAction的代码改成添加事件的代码:
this.OnBeginAction += new ProcessShowAction(StaticPageProcessor.GetStaticPageContent);
只要有这句话,这个Action自己就可以处理自己的静态化内容了。该方式实现起来更为优雅,而且似乎效率也更好一些。
目前没有读过大的程序代码,因此很多方法都是自己琢磨出来的,看来读代码真的是很有用啊,改天好好研究一下.Text的代码。