关于数据访问模式(七)—— Resource Decorator模式
2005-08-10 16:25 FantasySoft 阅读(2189) 评论(7) 编辑 收藏 举报 在资源模式当中,Resource Decorator(资源修饰器)和Resource Pool(资源池)的使用恐怕是最为广泛的了,而两者结合使用也相当常见。我们先来看一下Resource Decorator模式吧。所谓Resource Decorator模式其实很简单,就是将Decorator模式应用于数据库资源中的一个实例。什么是Decorator模式,这样老生常谈的话题,我就不在这里赘述了,仅将Resource Decorator模式的静态结构以图示之。
BaseResourceDecorator仅仅是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 ExtendedResourceDecorator(Resource reference) {
super(reference);
}
public void operationB() {
super.operationB();
this.otherOperation();
}
private void otherOperation() {
// Particular operatiions
}
}
使用ResourceDecorator模式最大的好处是:在不需要extend资源对象的情况下,改变资源原有的行为或者向资源添加新的行为。同时,它也存在一个很大的不足,就是Decorator必须实现资源接口定义的所有方法,哪怕你仅仅需要改变资源中一个行为。如果方法有几百个,写这样的Decorator也会让人头痛不已。在这个时候,动态代理就应运而生了。通过动态代理来实现Decorator模式,你只需要实现你想要改变其行为的方法即可,避免了代码冗余。具体的例子可参考: 体验模式的乐趣(二) —— 连接池与Decorator模式。