代码改变世界

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

2005-08-10 16:25 FantasySoft 阅读(...) 评论(...) 编辑 收藏

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

decorator.gif


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

public class BaseResourceDecorator implements Resource {
    
private
 Resource reference;
    
public BaseConnectionDecorator(Resource reference) 
{
           
this.reference =
 reference;
    }

    
   
public void operationA() {
        reference.operationA();
    }


   
public void operationB() {
        reference.operationB();
    }

     
   
public void operationX() {
        reference.operationX();
    }

}

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

public class ExtendedResourceDecorator extends BaseResourceDecorator {
   
public ExtendedResourceDecorator(Resource reference) 
{
    super(reference);
    }

   
public void operationB() {
        super.operationB();
        
this
.otherOperation();
    }


   
private void otherOperation() {
        
// Particular operatiions

    }

}

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