假如你是通过阅读了本博文的装饰者模式之后才选择阅读本文,那么本文会对装饰者模式和静态代理作出详细的对比。

若是你还未阅读装饰者模式也没有关系。

静态代理模式咋一看和装饰者模式有点一样。其实不然。

静态代理模式:静态代理类需要实现与目标对象一样的接口,或者继承相同的抽象类。需要在代理类有目标对象的引用。

上代码直观清晰

目标类:

//接口
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:功能增强的实现者不同

静态代理:代理类不存在继承关系,增强由代理类完成,不存在“链”的概念。

装饰者:装饰者类存在继承关系,基类不做增强,由其子类完成,存在一个“链”的概念。

posted on 2018-06-22 16:11  王衙内  阅读(118)  评论(0编辑  收藏  举报