posts - 257, comments - 1336, trackbacks - 63, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

        在资源模式当中,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模式。  

Feedback

#1楼    回复  引用    

2005-08-10 18:32 by commenter [未注册用户]
阳春白雪

#2楼 [楼主]   回复  引用  查看    

2005-08-10 18:54 by FantasySoft      
To commenter: 无人喝彩不要紧,只是希望能够引发大家的思考吧。 :)

#3楼    回复  引用    

2005-08-10 20:46 by hyq.net [未注册用户]
数据访问模式这本书我看过,还不错,很多设计模式在构建数访问层时的具体应用,本来也想写些文章的,看到已经有人写了,支持一下,希望继续写下去。

#4楼    回复  引用  查看    

2005-08-10 22:49 by FantasySoft      
To hyq.net: 谢谢您的支持,我会继续努力的!

#5楼    回复  引用  查看    

2005-08-11 11:32 by idior      
我来喝彩 :) 坚持下去,看完后写篇自己的心得.

#6楼 [楼主]   回复  引用  查看    

2005-08-11 13:56 by FantasySoft      
To idior: idior老大,谢谢您! 还望多多指教了。

#7楼    回复  引用    

2006-05-09 11:59 by vmsn@hotmail.com [未注册用户]
very good!
l'm doing the same with .Net now,
but some times ,it can't work as simple as java,
esp in the following interfaces:
IDbConnection and IDbCommand

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-10 16:59 编辑过


相关链接:

历史上的今天:
2004-08-10 我该怎样shuffle呢