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

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模式。
博客介绍了资源模式中Resource Decorator和Resource Pool使用广泛,着重讲解Resource Decorator模式,它是Decorator模式在数据库资源中的实例。使用该模式可在不扩展资源对象时改变或添加行为,但存在需实现所有方法的不足,此时动态代理可避免代码冗余。

被折叠的 条评论
为什么被折叠?



