代理设计模式

来源:互联网 发布:大数据分析的好处 编辑:程序博客网 时间:2024/06/03 22:39

代理模式

分类

  1. 静态代理
  2. 动态代理

静态代理

静态定义代理类

类图:

  1. 抽象角色
    定义代理角色和真实角色的公共对外方法
  2. 真实角色
    实现抽象角色,实现真正的核心逻辑
  3. 代理角色
    实现抽象角色,通过真实角色的业务逻辑方法来实现抽象方法,可以添加自己的功能

代码

/** *  * @author Nicholas 其中,sing()是核心逻辑 bookTicket() 是非核心方法 */public interface Star {    /**     * 唱歌     */    void sing();    /**     * 订票     */    void bookTicket();}public class RealStar implements Star {    @Override    public void sing() {        System.out.println(" real sing");    }    @Override    public void bookTicket() {        System.out.println("real book ticket");    }}/** * 代理对象 *  * @author Nicholas *  */public class ProxyStar implements Star {    /**     * 代理对象不能唱歌,但是可以定票     *      */    /**     * 要代理的对象     */    private Star realStar;    public ProxyStar(Star star) {        this.realStar = star;    }    @Override    public void sing() {        realStar.sing();    }    @Override    public void bookTicket() {    }}package com.weixuan.pattern.proxy;/** * Created by Nicholas on 2015/9/20. */public class Client {    public static void main(String[] args){        RealStar realStar = new RealStar();        Star proxyStar = new ProxyStar(realStar);        proxyStar.sing();        proxyStar.bookTicket();    }}

动态代理

动态生成代理类,不需要自己定义代理类

常见的工具
1. JDK自带的动态代理
2. javaassist字节码操作库的实现
3. CGLIB
4. asm底层使用指令

JDK自带的动态代理

核心的两个类
java.lang.reflect.Proxy:动态生成代理类和对象
java.lang.reflect.InvocationHandler:这个是处理器接口,可以使用invoke方法访问真实角色

代码

package com.weixuan.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyProxy implements InvocationHandler {    //要代理的对象    private Star reaStar;    public MyProxy(Star star) {        this.reaStar = star;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        method.invoke(reaStar, args);        return null;    }}package com.weixuan.proxy;import java.lang.reflect.Proxy;public class Main {    public static void main(String[] args) {        Star realStar = new RealStar();        MyProxy myProxy = new MyProxy(realStar);        Star proxyStar = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),                new Class[] { Star.class }, myProxy);        proxyStar.bookTicket();    }}
0 0
原创粉丝点击