设计模式(八)Dynamic Proxy Parttern 动态代理模式

举例:

  • jdk自带动态代理
  • javaassit字节码操作库实现
  • CGLIB
  • ASM底层操作

 

实际例子:

使用jdk自带动态代理

  • java.lang.reflect.Proxy 作用
    • 动态生成代理类和对象
  • java.lang.reflectInvocationHander
    • 可以通过invoke方法实现对真实角色的代理访问
    • 每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象

 

package com.littlepage.DynamicProxyParttern;

public interface Star {
    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收钱
    void collectMoney();
}

 

package com.littlepage.DynamicProxyParttern;

public class RealStar implements Star{

    @Override
    public void confer() {
        System.out.println("Real Star Confer");
    }

    @Override
    public void signContract() {
        System.out.println("Real Star SignContract");
    }

    @Override
    public void bookTicket() {
        System.out.println("Real Star BookTicket");
    }

    @Override
    public void sing() {
        System.out.println("Real Star Sing");
    }

    @Override
    public void collectMoney() {
        System.out.println("Real Star CollectMoney");
    }
    
}

 

 

package com.littlepage.DynamicProxyParttern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StarHandler implements InvocationHandler{
    Star realStar;

    public StarHandler(Star realStar) {
        this.realStar = realStar;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)//涉及反射
            throws Throwable {
        Object object=null;
        System.out.println("真正的方法执行");
        System.out.println("面谈,签合同,付款,订机票");
        if(method.getName().equals("sing")){
            method.invoke(realStar, args);//激活调用的方法
        }
        System.out.println("收尾款");
        return object;
    }

}

 

package com.littlepage.DynamicProxyParttern;

import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        RealStar rs=new RealStar();
        StarHandler sh=new StarHandler(rs);
        Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, sh);
        proxy.sing();
    }
}

 

运行结果:

 

原理图:

 

posted @ 2018-12-18 15:45  SteveYu  阅读(257)  评论(0编辑  收藏  举报