• 设计一个简单的缓存服务类



    摘自《应用框架的设计与实现-.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类或者微软企业库里的缓存模块吧,自己实现简直就是费力不讨好。
       我简单写一下伪代码,为缓存对象实现层次结构的代码比较长,但不复杂,没有具体写出来,详细代码请下

    载SAF的源码。
    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的基础知识,看起来收获不少,也很轻松。缺点是书中的那个框架没什么新颖的地方。

  • 相关阅读:
    get_folder_size.ps1
    python3-database-shelve
    Windows中实现不依赖账户登录的开机启动程序
    SpringBoot+SpringDataJPA如何实现自定义且自由度高的查询[多表,多查询条件,多排序条件,分页,自定义sql封装]
    Windows phone 8.1之数据绑定(Data Binding)
    TextBox使用技巧--转载
    在Eclipse中使用git把项目导入到git中--转载
    运用多种知识点实现一个综合小游戏
    Git帮助之初始化项目设置向导
    如何从Eclipse导入github上的项目源码--转载
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/642846.html
Copyright © 2020-2023  润新知