先讲一下目前的程序架构:一个比较典型的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的代码。

相关文章:

  • 2022-12-23
  • 2022-01-12
  • 2022-01-11
  • 2021-08-10
  • 2022-02-28
  • 2021-10-01
  • 2021-06-13
  • 2022-03-07
猜你喜欢
  • 2021-11-26
  • 2021-08-13
  • 2021-09-24
  • 2022-12-23
相关资源
相似解决方案