关于数据访问模式(七)—— Resource Decorator模式

        在资源模式当中,Resource Decorator(资源修饰器)和Resource Pool(资源池)的使用恐怕是最为广泛的了,而两者结合使用也相当常见。我们先来看一下Resource Decorator模式吧。所谓Resource Decorator模式其实很简单,就是将Decorator模式应用于数据库资源中的一个实例。什么是Decorator模式,这样老生常谈的话题,我就不在这里赘述了,仅将Resource Decorator模式的静态结构以图示之。
       

decorator.gif


BaseResourceDecorator仅仅是Resource的代理类,其中的方法都是简单的委托调用。具体代码如下所示:

ExpandedBlockStart.gifContractedBlock.gifpublic class BaseResourceDecorator implements Resource dot.gif {
InBlock.gif    
private Resource reference;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public BaseConnectionDecorator(Resource reference) dot.gif{
InBlock.gif           
this.reference = reference;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void operationA() dot.gif{
InBlock.gif        reference.operationA();
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void operationB() dot.gif{
InBlock.gif        reference.operationB();
ExpandedSubBlockEnd.gif    }

InBlock.gif    dot.gif dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void operationX() dot.gif{
InBlock.gif        reference.operationX();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

咋一看,BaseResourceDecorator并没有存在的必要,然而事实上使用了BaseResourceDecorator便于实现不同ResourceDecorator,而不同的实现之间并不会产生依赖关系,这样就增加了灵活性。ExtendedResourceDecorator则是真正意义的Decorator了,它派生于BaseResourceDecorator,改写或者增加相应的方法,以改变资源原有的行为或者向资源添加新的行为。代码如下所示:

ExpandedBlockStart.gifContractedBlock.gifpublic class ExtendedResourceDecorator extends BaseResourceDecorator dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public ExtendedResourceDecorator(Resource reference) dot.gif{
InBlock.gif    super(reference);
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void operationB() dot.gif{
InBlock.gif        super.operationB();
InBlock.gif        
this.otherOperation();
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
private void otherOperation() dot.gif{
InBlock.gif        
// Particular operatiions
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

        使用ResourceDecorator模式最大的好处是:在不需要extend资源对象的情况下,改变资源原有的行为或者向资源添加新的行为。同时,它也存在一个很大的不足,就是Decorator必须实现资源接口定义的所有方法,哪怕你仅仅需要改变资源中一个行为。如果方法有几百个,写这样的Decorator也会让人头痛不已。在这个时候,动态代理就应运而生了。通过动态代理来实现Decorator模式,你只需要实现你想要改变其行为的方法即可,避免了代码冗余。具体的例子可参考: 体验模式的乐趣(二) —— 连接池与Decorator模式。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值