假如你是通过阅读了本博文的装饰者模式之后才选择阅读本文,那么本文会对装饰者模式和静态代理作出详细的对比。
若是你还未阅读装饰者模式也没有关系。
静态代理模式咋一看和装饰者模式有点一样。其实不然。
静态代理模式:静态代理类需要实现与目标对象一样的接口,或者继承相同的抽象类。需要在代理类有目标对象的引用。
上代码直观清晰
目标类:
//接口 package com.wk.decorator; public interface IMyService { String sayHello(); } //实现类 package com.wk.decorator; public class IMyServiceImpl implements IMyService { @Override public String sayHello() { return "hello"; } }
静态代理类:
package com.wk.decorator; public class ImyProxy implements IMyService { private IMyService target; //在无参构造中创建目标对象。 public ImyProxy() { target = new IMyServiceImpl(); } @Override public String sayHello() { return "tom say "+target.sayHello(); } }
测试类:
package com.wk.decorator; public class Testproxy { public static void main(String[] args) { IMyService proxy=new ImyProxy(); String one=proxy.sayHello(); System.out.println(one); } }
测试结果:
tom say hello
看着代码我们来说一说
那么静态代理类和装饰者类的相同点就显而易见了:
1.都需要实现与目标对象相同的接口
2.都需要在类中有目标对象的声明。
3,都能在不改变目标对象的前提下,增强目标对象方法。
两者之间的区别想必你也看出了一些吧,那下面具体说一说:
1.两种模式的目的不同:
静态代理:用于隐藏和和保护目标对象。通过代码可以看出我们不知道目标对象是谁。
装饰者:就是为了增强目标对象。
2:两种模式中对于目标对象的获取方式不同:
静态代理:无参构造中直接创建。
装饰者:通过带参构造传入。
3:功能增强的实现者不同
静态代理:代理类不存在继承关系,增强由代理类完成,不存在“链”的概念。
装饰者:装饰者类存在继承关系,基类不做增强,由其子类完成,存在一个“链”的概念。