静态代理与装饰模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_cannon_fodder/article/details/83828564

静态代理与装饰模式

一、静态代理

  1. 代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑
  2. 客户类真正的想要访问的对象是目标类对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的
  3. 静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确定。静态代理类似于企业与企业的法律顾问间的关系。法律顾问与企业的代理关系,并不是在“官司”发生后才建立的,而是之前就确立好的一种关系。
  4. 静态代理实现转账
    • 定义业务接口
      在这里插入图片描述
    • 定义目标类,实现了业务接口
      在这里插入图片描述
    • 定义代理类,同样实现业务网接口,并且该代理类要将接口对象作为一个成员变量,还要定义一个带参的构造器,这个参数为接口对象。目的是,将目标对象引入代理类,以便代理类调用目标类的目标方法。
      在这里插入图片描述
    • 定义客户类 Client。在客户类中首先要创建目标对象,再创建代理对象,并使用目标对象对其进行初始化。然后由代理对象来调用执行业务方法。
      在这里插入图片描述

二、装饰模式

  1. 概述
    Decorator Pattern,能够在不修改目标类也不使用继承的情况下,动态地扩展一个类的 功能。它是通过创建一个包装对象,也就是装饰者来达到增强目标类的目的的。
  2. 装饰者设计模式的实现有两个要求:
    • 装饰者类与目标类要实现相同的接口,或继承自相同的抽象类。
    • 装饰者类中要有目标类的引用作为成员变量,而具体的赋值一般通过带参构造器完成。
    • 这两个要求的目的是,在装饰者类中的方法可以调用目标类的方法,以增强这个方法。 而增强的这个方法是通过重写的方式进行的增强,所以要求实现相同的接口或继承相同的抽 象类。
  3. 在装饰者设计模式中,装饰者类一般是不对目标类进行增强的。装饰者类作为一个基类, 具体的装饰者继承自这个基类,对目标类进行具体的、单功能的增强。这样做的好处是,在 很方便的情况下可以实现多重地、组合式地增强。
  4. 装饰者基类就像是一个装修公司的老板,其不做任何具体的装修工作。而具体的装饰者 则相当于装修公司中的木工、刷漆工、水电工等具体的装修师傅。装修公司的老板可以根据 具体的装修工程,任意组合式地调用不同工种的装修工人。
  5. 装饰者模式设计的实现
    下面的例子实现的功能是,对于目标类中的方法 doSome()进行功能增强。为该目标类 定义一个装饰者类后,再定义两个具体的装饰者类:一个用于将 doSome()的返回值去掉前 后空格,一个用于将 doSome()的返回值小写变大写。当然,装饰者模式允许构造一个装饰 者增强链对目标类进行连接增强。
    • 定义业务接口ISomeService
      在这里插入图片描述
    • 定义目标类 SomeServiceImpl
      在这里插入图片描述
    • 定义装饰者基类 SomeServiceWrapper
      在这里插入图片描述
    • 定义去空格装饰者类 TrimDecorator
      在这里插入图片描述
    • 定义小写变大写装饰者类 ToUpperCaseDecorator
      在这里插入图片描述
    • 定义测试类 MyTest
      对于第二次增强,需要注意的是,其带参构造器中所带参数,即要增强的目标对象是 trimDecorator,是第一次增强后的对象,也是一个具体装饰者。这样的话,形成了 trimDecorator 增强 service,而 toUpperCaseDecorator 增强 trimDecorator 的装饰者增强链。
      在这里插入图片描述

三、装饰者设计模式与静态代理设计模式的对比

  1. 相同点:
    • 装饰者类与目标类要求实现同一接口;静态代理类与目标类要求也实现同一接口。
    • 装饰者类与静态代理类都可以实现增强目标类的功能。
    • 装饰者类与静态代理类中都具有目标类的引用,目的都是为了在其中调用目标类的方 法。
  2. 不同点
    • 装饰者设计模式就是为了增强目标类;静态代理设计模式是为了保护和隐藏目标对象, 让客户类只能访问代理对象,而不能直接访问目标对象。
    • 装饰者类中的目标类的引用是通过带参构造器传入的;静态代理类中的目标类的引用, 一般都是在代理类中直接创建的,目的就是为了隐藏目标对象。
    • 装饰者基类一般不对目标对象进行增强,而是由不同的具体装饰者进行增强的,且这 些具体的装饰者可以形成增强链,对目标对象进行连续增强。静态代理类会直接对目标对象 进行增强,需要哪些增强的功能,一次性在静态代理类中完成,没有增强链的概念。

猜你喜欢

转载自blog.csdn.net/king_cannon_fodder/article/details/83828564