代理模式_笔记整理

来源:互联网 发布:我知谁掌管明天刘若英 编辑:程序博客网 时间:2024/05/29 10:51

代理模式之静态代理

文件一:

package com.niit.static_proxy;


/**
 * 文件名称: com.niit.static_proxy.IUserDao.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 静态代理接口 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public interface IUserDao {


public void save();
}


文件二:

package com.niit.static_proxy;


/**
 * 文件名称: com.niit.static_proxy.UserDaoImpl.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明:目标对象 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class UserDao implements IUserDao {


@Override
public void save() {


System.out.println("保存用户");


}


}


文件三:

package com.niit.static_proxy;


/**
 * 文件名称: com.niit.static_proxy.UserDaoProxy.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 用于维护目标对象 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class UserDaoProxy implements IUserDao {


private IUserDao iuserDao;


// 添加代理对象类构造函数
public UserDaoProxy(IUserDao iuserDao) {
super();
this.iuserDao = iuserDao;
}


@Override
public void save() {


// 实现原目标对象的功能
iuserDao.save();
// 在实现目标功能的基础上添加新的功能
System.out.println("添加了一些新的功能");
}
}


文件四:

package com.niit.static_proxy;


import org.junit.Test;


/**
 * 文件名称: com.niit.static_proxy.TestDemo.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 测试类<br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class TestDemo {


@Test
public void test() {


// 直接访问目标对象UserDao
// IUserDao userDao = new UserDao();
// userDao.save();


// 通过访问代理对象UserDaoProxy进而访问目标对象UserDao
IUserDao iuserDao = new UserDao();
UserDaoProxy udp = new UserDaoProxy(iuserDao);
udp.save();
}
}


代理模式之动态代理

文件一:

package com.niit.dynamic_proxy;


/**
 * 文件名称: com.niit.static_proxy.IUserDao.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 动态代理接口 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public interface IUserDao {


public void save();
}

文件二:

package com.niit.dynamic_proxy;


/**
 * 文件名称: com.niit.static_proxy.UserDaoImpl.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明:目标对象 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class UserDao implements IUserDao {


@Override
public void save() {


System.out.println("保存用户");


}


}

文件三:

package com.niit.dynamic_proxy;


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


/**
 * 文件名称: com.niit.dynamic_proxy.ProxyFactory.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 动态代理工厂类 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class ProxyFactory {


// 目标对象
Object target;


public ProxyFactory(Object target) {
super();
this.target = target;
}


// 获取动态代理工厂类对象实例
public Object getProxyInstance() {


// 通过JDK生成的代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),


// 告知目标对象实现的接口类型
target.getClass().getInterfaces(),
// 方法处理器
new InvocationHandler() {


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


// 执行目标对象的方法 —————第一个参数:目标对象 第二个参数:方法参数
method.invoke(target, args);
System.out.println("添加了一些新的功能");
return null;
}
});


}
}

文件四:

package com.niit.dynamic_proxy;


import org.junit.Test;


/**
 * 文件名称: com.niit.static_proxy.TestDemo.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 测试类<br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class TestDemo {


@Test
public void test() {


// 遵循开闭原则
// 获取目标对象
IUserDao iuserDao = new UserDao();
// 通过JDK动态获取代理对象
IUserDao iud = (IUserDao) new ProxyFactory(iuserDao).getProxyInstance();
iud.save();
}
}


代理模式之Spring核心包cglib代理

cglib代理又叫做子类代理,在内存中创建目标对象的子类来拓展目标对象的功能

注意:该实现方式需要导入Spring核心jar包:

文件一:

package com.niit.cglib_proxy;


/**
 * 文件名称: com.niit.static_proxy.UserDaoImpl.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明:目标对象 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class UserDao {


public void save() {


System.out.println("保存用户");


}


}

文件二:

package com.niit.cglib_proxy;


import java.lang.reflect.Method;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


/**
 * 文件名称: com.niit.dynamic_proxy.ProxyFactory.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 动态代理工厂类 <br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class ProxyFactory implements MethodInterceptor {


// 目标对象
Object target;


public ProxyFactory(Object target) {
super();
this.target = target;
}


// 返回代理对象
public Object getProxyInstance() {


// 1、创建工具类
Enhancer enhancer = new Enhancer();
// 指定父类
enhancer.setSuperclass(target.getClass());
// 设置回调函数 this指的是调用该方法的对象
enhancer.setCallback(this);
// 生成代理对象
return enhancer.create();


}


@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {


// 调用原有的功能
arg1.invoke(target, arg2);
// 在原有的基础上扩展新的功能
System.out.println("扩展了一些功能");


return null;
}
}

文件三:

package com.niit.cglib_proxy;


import org.junit.Test;


/**
 * 文件名称: com.niit.static_proxy.TestDemo.java</br>
 * 初始作者: Angel_G</br>
 * 创建日期: 2016年12月8日</br>
 * 功能说明: 测试类<br/>
 * =================================================<br/>
 * 修改记录:<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2010-2011 .All rights reserved.<br/>
 */
public class TestDemo {


@Test
public void test() {


// 获取目标对象
UserDao userDao = new UserDao();
// 通过Spring核心包中的cglib代理功能(子类代理)获取代理对象
UserDao userDaoProxy = (UserDao) new ProxyFactory(userDao).getProxyInstance();
userDaoProxy.save();
}
}

0 0