feipeng

不要过分强调技术,思想才是关键!
  新随笔  :: 管理

ObjectBuilder中WeakRefDictionary使用模式浅析

Posted on 2007-08-02 11:29  FrankFei  阅读(2110)  评论(2编辑  收藏  举报

FrankFei at 2007/08/02

 

大家在学习ObjectBuilder的Locator时,可能都知道里面是使用WeakRefDictionary作为它内部的存储结构,以实现对象的缓冲机制。那WeakRefDictionary的是如何实现的呢?其实它是采用对象适配器模式,把一个Dictioary泛型集合对象适配成符合存储弱引用对象的集合。

我们先来回顾一下对象适配器模式,下面是结构图:

目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:通过在内部包装(Wrap)一个Adaptee对象,把源接口转换成目标接口。

我们再来看一下WeakRefDictionary的定义:

public class WeakRefDictionary<TKey, TValue>

     
{

         
private Dictionary<TKey, WeakReference> inner = new Dictionary<TKey, WeakReference>();

         
public WeakRefDictionary()

         
{

         }


         
public void Add(TKey key, TValue value)

         
{

              TValue dummy;

 

              
if (TryGet(key, out dummy))

                   
throw new ArgumentException(Properties.Resources.KeyAlreadyPresentInDictionary);

 

              inner.Add(key, 
new WeakReference(EncodeNullObject(value)));

         }


         
public bool Remove(TKey key)

         
{

              
return inner.Remove(key);

         }


         …

     }


上面只是列出一小部分代码,但从中我们可以看出一个简化的对象适配器模式的实现。结构图中的Adapter是继承自Target的,此处的WeakRefDictionary对应Adapter,但WeakRefDictionary却并没有继承任何类,所以我上面说这是一个简化的对象适配器模式的实现。那适配(Adaptee)的是什么对象呢?很显然,就是泛型Dictionary了,只是这个地方适配的方法名称是一样的,比如inner.Add(key, new WeakReference(EncodeNullObject(value)));对应于public void Add(TKey key, TValue value),inner.Remove(key);对应于public bool Remove(TKey key),而不像结构图中Adaptee的方法SpecificRequest()被适配成了Adapter中的方法Request()那么明显。

当然ObjectBuilder中定义这样一个Adapter:WeakRefDictionary不仅仅只是上面提到的那几个适配,我这里只是提出这样一个概念,上面只是我个人的理解,不当之处请指教!