码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之代理模式

时间:2018-03-27 17:21:37      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:hand   dimp   编译   ide   动态创建   调用   row   技术   技术分享   

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

本质上,动态代理是在程序运行过程中创建生成一个类并且将它加载到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();
    }
}

 

设计模式之代理模式

标签:hand   dimp   编译   ide   动态创建   调用   row   技术   技术分享   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!