惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
L
LangChain Blog
GbyAI
GbyAI
F
Fortinet All Blogs
腾讯CDC
Last Week in AI
Last Week in AI
A
About on SuperTechFans
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
B
Blog
D
Docker
G
Google Developers Blog
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
U
Unit 42
Blog — PlanetScale
Blog — PlanetScale
B
Blog RSS Feed

博客园 - Jason Cui

求助:SQL Server 2005数据库修复后无法收缩 Django:更简单的实现记住密码功能 用Bugols管理自己的项目 请教:为何Asp.net网站会自己弹出用户名密码输入框? 中文在线Bug管理系统 为什么要创建“理财易”? 继续招聘,请个好用的人可真难啊。 招聘两个Asp.net程序员 记账理财网站列表,用户自己挑一个用吧 坚持,究竟有多难? 又改了一次Django的源代码 请教,关于跨站提交的问题,和网站恶意抓取的防止 请教一个有关反射和缓存的高难度问题 诚聘:Asp.net高级技术人员两名 修改了一下Django的源码 幸亏没有选择Ruby On Rails Django运行环境配置 Django学习笔记 Python下的Lucene,PyLucene
关于委托的一次实践
Jason Cui · 2006-11-10 · via 博客园 - Jason Cui

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