Spring中常见的设计模式——装饰者模式

一、装饰者模式的应用场景

  装饰者模式(Decorator Pattern)是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的方案(扩展原有对象的功能),属于结构型模式。装饰者模式适用于以下场景:

  • 扩展一个类的功能或给一个类添加附加职责。
  • 动态给一个对象天机功能,这些功能可以再动态的撤销。

  以做煎饼果子为例演示装饰者模式是怎么装的:

  首先做一个煎饼果子抽象:

public abstract class Battercake {
    protected abstract String getMsg();

    protected abstract Integer getPrice();
}

  然后,做一个基本的煎饼果子:

public class BaseBattercake extends Battercake{
    @Override
    protected String getMsg() {
        return "煎饼";
    }

    @Override
    protected Integer getPrice() {
        return 5;
    }
}

  创建扩展套餐的抽象装饰者:

public class BattercakeDecorator extends Battercake {
    //静态代理 委派
    private Battercake battercake;

    public BattercakeDecorator(Battercake battercake) {
        this.battercake = battercake;
    }

    @Override
    protected String getMsg() {
        return battercake.getMsg();
    }

    @Override
    protected Integer getPrice() {
        return battercake.getPrice();
    }
}

  创建加鸡蛋装饰类:

public class EggDecorator extends BattercakeDecorator {
    public EggDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "add an egg";
    }

    @Override
    protected Integer getPrice() {
        return super.getPrice() + 1;
    }
}

  客户端:

public class BattercakeTest {
    public static void main(String[] args) {
        //基本版
        Battercake battercake = new BaseBattercake();

        //加蛋
        battercake = new EggDecorator(battercake);

        //再加
        battercake = new EggDecorator(battercake);

        //跟静态代理区别在于静态代理不是is-a关系 晶体代理会做功能增强,使同一个职责变得不一样
        //装饰者模式更多考虑扩展
    }
}

二、装饰者模式和适配器模式对比

  装饰者模式和适配器模式都是包装模式(Wrapper Pattern),装饰者模式是一种特殊的代理模式,二者对比如下:

  装饰者模式 适配器模式
形式 是一种非常特别的适配器 没有层级关系,装饰者模式有层级关系
定义 装饰者和被装饰着实现同一接口,主要目的是为了扩展后依旧保留旧的oop关系 适配器和被适配这没有必然的关系,通常采用继承或代理的形式进行包装
关系 满足is-a关系 满足has-a关系
功能 注重覆盖、扩展 注重兼容、转换
设计 前置考虑 后置考虑

三、装饰模式在源码中的应用

  JDK中的I/O,如BufferReader,InputStream,OutputStream.Spring的缓存,myabtis的TransactionalCache(事物相关缓存):

public class TransactionalCache implements Cache {
    private static final Log log = LogFactory.getLog(TransactionalCache.class);
    private final Cache delegate;
    ...
    public TransactionalCache(Cache delegate) {
        this.delegate = delegate;
        ...
    }
    ...
}

四、装饰者模式的优缺点

 优点:

  • 装饰者模式是继承的有力补充,比继承灵活,可以再不原有对象的情况下动态的给一个对象扩展功能,即插即用。
  • 使用不同的装饰类及这些装饰类的排列组合,可以实现不同的效果。
  • 装饰者模式完全符合开闭原则。

 缺点:

  • 动态装饰时,多层装饰会更复杂。
  • 增加复杂度,复杂度等等吧那些废话。

原文地址:https://www.cnblogs.com/xcgShare/p/12195901.html

时间: 2024-11-09 00:50:36

Spring中常见的设计模式——装饰者模式的相关文章

Spring中常见的设计模式——单例模式

一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletContextConfig等:Spring中的ApplicationContext.数据库连接池等. 二.饿汉式单例模式 饿汉式单例模式在类加载的时候就立即初始化,并且创建单例对象.它是绝对的线程安全.在线程还没出现以前就实现了,不可能存在访问安全问题. 优点:没有增加任何锁,执行效率高,用户体验比懒汉式

5分钟读书笔记之 - 设计模式 - 装饰者模式

本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者模式对象是一种更灵活的选择. 装饰者可用于为对象增加功能.它可以用来替代大量子类. 考虑前面的自行车类,你现在可能提供一些配件供用户选择,装饰者模式要求我们只需要创建选件类,这些类与四种自行车类都要实现Bicycle接口,但是他们只被用作这些自行车类的包装类.在这个例子

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()