代理模式和装饰模式的区别

代理模式详见《Java-动态代理》
装饰模式详见《装饰者模式》

代理模式

代理模式就是为其他对象提供一种代理以控制对这个对象的访问。

代理类与委托类之间通常会存在关联关系,我们在访问实际对象时,是通过代理对象来访问的。代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。代理类提供附加功能。

代理模式和装饰模式的区别_第1张图片

代理模式中最终都是通过代理类对象来访问,被代理的类对外是隐藏的,只能看到代理类。

装饰模式

装饰模式:动态地给一个对象增加一些额外的职责。就扩张功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。

代理模式和装饰模式的区别_第2张图片
  • Component(抽象构建类):它是具体构件类和抽象装饰类的父类。声明规范具体构建类的业务方法。
  • ConcreteComponent(具体构件类):它是抽象构建类子类,实现了抽象构建类业务方法,具体装饰类会给它增加额外的功能。
  • Decorator(抽象装饰类):它也是抽象构建类子类,继承或实现抽象构件。它维护一个指向抽象构建对象的引用通过该引用可以调用装饰之前构建对象的方法并通过其子类扩展该方法,已达到装饰的目的
  • ConcreteDecorator(具体装饰类):它是抽象装饰类子类,实现抽象装饰类的相关方法,负责具体构件类添加新的功能。每一个具体的装饰类都定义了一个具体的行为。

装饰模式是通过自己传入需要被装饰的对象,然后再使用装饰过后的对象的增强方法。

区别

代理模式和装饰模式的区别_第3张图片

两者都是对类的方法进行增强,但装饰器模式强调的是增强自身,在被装饰之后你能够够在被增强的类上使用增强后的方法。增强过后还是你,只不过能力变强了

而代理模式则强调要别人帮你去做一些本身与你业务没有太多关系的职责。代理模式是为了实现对象的控制因为被代理的对象往往难以直接获得或者是其内部不想暴露出来

装饰类的代码编写和代理很类似,具体区别如下:

  1. 代理是全权代理,被代理类根本不对外,全部由代理类来完成,通过代理对象来访问
  2. 装饰是增强,是辅助,被代理类仍然可以自行对外提供服务,装饰器只起增强作用。
  3. 代理的目标也可以是类,装饰目标必须是接口。
  4. 代理模式应用有Spring AOP和Spring 事务等;装饰模式应用IO类,Spring过滤器也会用到装饰模式,可以链式调用。

总之,一句话,代理模式只能通过代理类访问,装饰模式被装饰都可以被访问,只是功能被增强。

你可能感兴趣的:(设计模式,代理模式,装饰器模式)