`

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

阅读更多

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

分享到:
评论

相关推荐

    装饰者模式——Decorator

    在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...

    设计模式代码——c#

    8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) ...

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象添加新的责任或功能,而不必通过子类化的方式。在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    设计模式-Java语言中的应用(pdf)

    例如,EJB(Enterprise JavaBeans)中的会话bean和实体bean体现了工厂模式和单例模式,而Hibernate作为流行的ORM(Object-Relational Mapping)框架,其核心机制就是数据访问对象(DAO)模式。 总之,设计模式是...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    JAVA设计模式学习12——装饰器模式

    这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的核心在于定义一个抽象组件接口(Component),这个接口定义了基本的行为和属性。然后有一个具体的组件类...

    .Net中的设计模式——Decorator模式

    一、模式概述一个场景是我们要为一个对象动态添加新的职责,这个职责并不修改原有的行为,而是在原有行为基础上添加新的功能,就好比装饰工人为一座新居的墙上涂抹上色彩缤纷的颜料一般。 从我们拥有的面向对象的...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    【标题】:“装饰者模式(decorator)在Head First设计模式中的详解” 【内容】: 装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的...

    设计模式之Decorator

    博文链接:https://your.iteye.com/blog/133420

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    C#设计模式——装饰模式应用实例

    本实例是关于如何在开发图形界面构件库中应用装饰模式的一个实践。 首先,我们有`VisualComponent`接口或基类,它是所有图形组件的基础。这个接口或类定义了图形组件的基本操作,如绘制、获取尺寸等。例如,`...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

Global site tag (gtag.js) - Google Analytics