0
点赞
收藏
分享

微信扫一扫

动态代理


1、在静态代理的基础上演化而来,只是动态代理不需要自己编写代理类,由jdk自带的工具类动态产生(中间利用了反射技术)

2、代码如下:


package com.tiger.dynamic_proxy;
/**
* 明星接口,代理模式中,给代理角色和真实角色实现
* @author tiger
* @Date 2017年9月3日
*/
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signContact();
/**
* 订票
*/
void bookList();
/**
* 唱歌,核心业务
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
package com.tiger.dynamic_proxy;
/**
* 真实角色,主要实现核心业务逻辑,作为歌手明星,主要逻辑是唱歌
* @author tiger
* @Date 2017年9月3日
*/
public class RealStar implements Star {
String name;
public RealStar(String name) {
this.name = name;
}
@Override
public void confer() {
System.out.println("RealStar.confer()");
}

@Override
public void signContact() {
System.out.println("RealStar.signContact()");
}

@Override
public void bookList() {
System.out.println("RealStar.bookList()");
}

@Override
public void sing() {
System.out.println(name + " 在倾情演唱!");
}

@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
package com.tiger.dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 处理器接口,同时在这里利用反射技术产生代理类对象
* @author tiger
* @Date 2017年9月3日
*/
public class ProxyHandler implements InvocationHandler {
//持有真实(目标)对象的引用
private Object target = null;

public void setTarget(Object target) {
this.target = target;
}
/**
* 传入目标接口对象
* @param target
*/
public ProxyHandler(Object target) {
this.target = target;
}
/**
* 生成代理类,便于与client打交道
* 1、类加载器
* 2、接口对象
* 3、处理器对象
*/
public Object getProxy(){
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
/**
* 统一流程处理控制,业务流程组装(公共方法与核心方法对接)
* 使用了反射技术
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
confer();
signContact();
bookList();

//真实角色处理核心业务,传入什么方法就执行什么方法
Object obj = method.invoke(target, args);

collectMoney(method.getName());
return obj;
}

/**
* 以下是中介代理需要做的事情(公共流程方法)
*/
private void confer(){
System.out.println("ProxyHandler.confer()");
}
private void signContact(){
System.out.println("ProxyHandler.signContact()");
}
private void bookList(){
System.out.println("ProxyHandler.bookList()");
}
private void collectMoney(String method){
System.out.println(method+" ProxyHandler.bookList()");
}
}
package com.tiger.dynamic_proxy;

/**
* 具有听歌需求的客户,只与顶层接口打交道
* 父类引用不能指向子类特有的方法
* @author tiger
* @Date 2017年9月3日
*/
public class Client {
public static void main(String[] args) {
//处理器接口对象
ProxyHandler handler = new ProxyHandler(new RealStar("邓紫棋"));
//获得代理对象
Star proxy = (Star) handler.getProxy();
//执行方法
proxy.sing();
}
}





举报

相关推荐

0 条评论