2012-07-30 131 views
0

我正在开发Web服务客户端上的包装。有很多这样的包装。 我也将实施缓存。我确定的类别如下设计一个类层次结构

CachableWraper abstract class 
W1Wrpaaer  
W2Wraper 

W1Wrapper,W2Wrapper具有不同的功能来获得数据,因此有转移到基类,其他则高速缓存逻辑

W1Wrapper implements IW1Wrapper extends CachableWrapper 
W2Wrapper implements IW2Wraper extends CachableWrapper 

没有共同的功能,但所有的包装可能不cachabe。

所以我应该有heirerachy如下

   Wrapper 
NonChacableWrapper  CahacableWrapper 

但目前还没有摆在NonChacableWrapper.So需要它的具体方法是什么?

是包装一个接口/ abstarct类?有它

没有方法在什么包IW1Wrapper,Iw2wrapper居住?

是否需要Iwrappers接口?如果是,为什么?

+0

源代码中的所有拼写错误使它很难理解你的意思... – meriton 2012-07-30 05:30:24

+0

@meriton:更正所有拼写错误:) – user978939 2012-07-30 05:44:52

+0

其实,还有6个... – meriton 2012-07-30 05:47:21

回答

1

在这种情况下,我会建议你反转依赖关系。如果缓存逻辑与业务逻辑正交(应该是这样),则可以创建“通过”缓存:

假设您的服务实现接口IService。

定义Cache以实现此接口:Cache:IService。 缓存将在其腹部保存一个实际的IService实例,并将它们委托给它。 你通过这个获得了什么,现在你可以拦截到服务的所有请求并在那里添加你的逻辑。例如:

interface IService{ 
    int get(int i); 
} 

Cache implements IService{ 
    IService actualService; 
    int get(i){ 
    int res = actualService.Get(i); 
    // cache result logic 
    return res; 
    } 
} 

现在,任何实施IService的人都可以获得缓存服务,并且它绝对透明!客户端对接口工作,而不是具体类型,只要他看到预期的功能,他并不在乎他实际上是否在使用缓存。

+0

@活力:感谢回复。但我的方法有什么问题? – user978939 2012-07-30 05:59:51

+0

你的方法要复杂得多。为了确定某件事是否是'Cachable',你需要定义一个复杂的Wrapper层次结构,这是不合理的。 缓存层对用户应该尽可能透明。此外,这种方式你不要求需要使用缓存服务的类型需要继承某些东西。 – Vitaliy 2012-07-30 07:22:17