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

推荐订阅源

Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
罗磊的独立博客
雷峰网
雷峰网
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
爱范儿
爱范儿
B
Blog RSS Feed
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
D
Docker
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
小众软件
小众软件
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
I
InfoQ
S
SegmentFault 最新的问题

博客园 - FrankFei

创采人力资源管理软件--产品简介 创采e-HR荣获江苏省高新技术产品认定 个人经典收藏网址 创采人事档案管理系统(ASP.NET+ExtJS) 创采应用框架开发平台--CFrame 创采人事管理软件--分布式的人力资源管理解决方案 创采e-HR合作经营 创采人事管理软件 创采人力资源管理系统 使用.Net和ExtJS技术开发的人力资源管理系统 ObjectBuilder应用之TypeMappingPolicy、SingletonPolicy ObjectBuilder中IBuilderPolicy和IBuilderStrategy之区别 ObjectBuilder模式浅析 NHibernate连接多数据库字符定义问题 优化GridView的查询、翻页性能 名言警句 折叠内容 [转]NUnit2.0详细使用方法 设计模式--Prototype
ObjectBuilder中WeakRefDictionary使用模式浅析
FrankFei · 2007-08-02 · via 博客园 - FrankFei

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不仅仅只是上面提到的那几个适配,我这里只是提出这样一个概念,上面只是我个人的理解,不当之处请指教!