首页 > 其他 > 详细

设计模式之代理模式

时间:2018-03-27 17:15:52      阅读:195      评论:0      收藏:0      [点我收藏+]

使用聚合模式实现静态代理

本质上,动态代理是在程序运行过程中创建生成一个类并且将它加载到JVM中,通过上面的实现步骤,他是把额外的代码(spring中叫切面)植入到被代理类(方法)中以后合成一个类。与静态代理的实现是一样的.

 

静态代理:在编译时创建代理类。代理类和方法都是固定的。不可改变。

每个代理类都需要实现该接口方法。

技术分享图片

 

1、定义接口

package cn.xiang.proxy;

public interface HelloWorld {
    void sysHello();
}

2、实现接口,被代理类

package cn.xiang.proxy;

public class HelloWorldImpl implements HelloWorld{

    @Override
    public void sysHello() {
        System.out.println("HelloWordImpl --> sysHello() --> start");
        System.out.println("HelloWordImpl --> sysHello() --> end");
    }
    
}

3、创建代理类

package cn.xiang.proxy;

public class HelloWorldProxy implements HelloWorld{
    private HelloWorld helloWord;
    public HelloWorldProxy(HelloWorld helloword) {
        this.helloWord = helloword;
    }

    @Override
    public void sysHello() {
        System.out.println("HelloWordproxy sysHello() --> start");
        helloWord.sysHello();
        System.out.println("HelloWordproxy sysHello() --> end");
    }

}

4、调用代理类实现静态代理

public class Action {
    public static void main(String[] args) {
        new HelloWorldProxy(new HelloWorldImpl2()).sysHello();
    }
}

 

动态代理

在运行时动态创建代理对象,对象和方法都不是固定的。

技术分享图片

1、创建接口

public interface HelloWorld {
    void sysHello();
}

2、创建被代理对象,实现接口

public class HelloWorldImpl implements HelloWorld{
    @Override
    public void sysHello() {
        System.out.println("HelloWordImpl --> sysHello() --> start");
        System.out.println("HelloWordImpl --> sysHello() --> end");
    }
}

3、创建动态代理生成对象。实现InvocationHandler接口

public class HelloWorldProxy implements InvocationHandler{
    private HelloWorld helloWord;
    public HelloWorldProxy(HelloWorld helloword) {
        this.helloWord = helloword;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态生成代理对象--开始");
        Object obj = method.invoke(helloWord, args);
        System.out.println("动态生成代理对象--成功");
        return obj;
    }
}

5、动态调用生成动态代理对象,并执行动态方法

public class Action {
    public static void main(String[] args) {
        HelloWorldImpl hwi = new HelloWorldImpl();
        HelloWorld hw = (HelloWorld) Proxy.newProxyInstance(hwi.getClass().getClassLoader(), 
                hwi.getClass().getInterfaces(),
                new HelloWorldProxy(hwi));
        hw.sysHello();
    }
}

 

设计模式之代理模式

原文:https://www.cnblogs.com/xiangyuqi/p/8658526.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!