设计一个简单的缓存服务类
摘自《应用框架的设计与实现-.net平台》
首先明确设计缓存服务的目的:
1、提供对象存取机制
2、为应用开发者提供简单易用的接口
思路:
设计一个缓存辅助类CacheHelper,里面有几个静态方法就够了,添加缓存对象、删除一个制定的缓存对象、删除一组制定的缓存对象、获取一个指定的缓存对象、获取一组制定的缓存对象等。
简单点在你的CacheHelper类里放一个静态的哈希表,然后写几个方法就可以实现缓存服务了。有时候我们想为缓存对象分类,不过哈希表的key又不能重复。你可以定义一组分类常量,比如说"category1","category2"等,这样用字符串就可以给缓存对象分成若干类了。添加缓存对象的时候用常量分类字符串加上对象ID字符串作为key加进去,比如说"Category1/Object1",里面用一个辅助的xml文档对象来为所有的缓存对象生成一颗对象树,并且为新添加的对象在对象树上添加一个节点,然后创建一个guid作为哈希表的key,并且把这个guid作为新添加节点上的一个属性,这样所有的缓存对象就有层次结构了。 取的时候用这些分类常量字符串加上你的对象ID构建一个xpath字符串,然后在内部辅助的xml文档对象上查询出制定节点,然后获取这个节点的哪个GUID属性,再用这个GUID去从哈希表里取出缓存的对象并返回,强制转换后就可以使用。如果你要获取一组的对象,比如说获取Catgory1分类下所有缓存的对象,就可以根据传入的“Category1”的字符串,这样的xpath字符串再xml文档对象上会获取一组节点,所以就会获取若干个key,从而就可以从哈希表中获取一系列的对象了。
当然了,用哈希表保存缓存对象有一些弊端,如果对象特别多的话,内存消耗会很大,那么你可以定义一个缓存策略的接口,接口有AddObject,RemoveObject,RetriveObject等方法,然后写几个具体类实现这个接口,比如说把缓存对象保存到硬盘或者数据库等。然后在CacheHelper类里生命一个这个接口的私有成员,然后用适配器模式来写CacheHelper类自身的方法。这就简单实现了一个缓存服务了,如果你要加上缓存过期、依赖、缓存策略之类的东西,你还是直接用System.Web下的Cache类或者微软企业库里的缓存模块吧,自己实现简直就是费力不讨好。
我简单写一下伪代码,为缓存对象实现层次结构的代码比较长,但不复杂,没有具体写出来,详细代码请下
using System;
using System.Collections;
public class CacheHelper
{
//定义一个缓存策略类,以便在具体的方法中使用该类。
//这里用的适配器模式,cs是被适配的对象
//这里还用到了策略模式,所以cs是个接口
ICacheStrategy cs;
private CacheHelper()
{
//通过配置文件实例化cs,用ICacheStrategy引用一个具体的缓存存储类
}
//这里用双重锁定技术实现单件模式
public CacheHelper Instance
{
get
{
return new CacheHelper();
}
}
public bool AddCacheObject(string key, object o) { throw new NotImplementedException(); }
public object GetCacheObject(string key) { throw new NotImplementedException(); }
public object[] GetCacheObjecst(string keyCategory) { throw new NotImplementedException(); }
public void RemoveCacheObject(string key) { }
}
//这个是缓存策略类,使用了策略模式,可以替换缓存保存的具体算法
public interface ICacheStrategy
{
bool AddObject();
object RetriveObject();
void RemoveObject();
}
public class SimpCacheStrategy : ICacheStrategy
{
Hashtable ht;
//下面的方法利用哈希表的特性实现缓存的添加、删除和获取。
//这里也使用适配器模式,ht是被适配的对象
public bool AddObject(){throw new NotImplementedException();}
public object RetriveObject(){throw new NotImplementedException();}
public void RemoveObject(){}
}
小节:vs2005自带的类图设计器连依赖关系和接口实现的关系也无法表现,所以图也没画出来,只简单写了写代码。另外《应用框架的设计与实现-.net平台》这本书翻译的不错,浅显易懂,各个框架服务的思路很好,又涉及到一些设计模式和.net的基础知识,看起来收获不少,也很轻松。缺点是书中的那个框架没什么新颖的地方。