代理模式
来源:互联网 发布:c语言参考手册 pdf 编辑:程序博客网 时间:2024/06/05 10:47
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
public interface GiveGift {
publicvoid GiveDolls();
publicvoid GiveFlowers();
publicvoid GiveChocolate();
}
Jack真实对象
public class Jack implements GiveGift{
Girlgirl;
public Jack(Girl girl){
this.girl = girl;
}
@Override
publicvoid GiveDolls() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送洋娃娃");
}
@Override
publicvoid GiveFlowers() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送花");
}
@Override
publicvoid GiveChocolate() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送巧克力");
}
}
代理
public class Proxy implements GiveGift{
Jackjack;
public Proxy(Girl girl){
jack =new Jack(girl);
}
@Override
public void GiveDolls() {
//还可以添加其它操作
jack.GiveDolls();
}
@Override
public void GiveFlowers() {
//还可以添加其它操作
jack.GiveFlowers();
}
@Override
public void GiveChocolate() {
//还可以添加其它操作
jack.GiveChocolate();
}
//还可以提供更多的方法,比如花和巧克力一起送
}
publicclass Girl {
private Stringname;
private Stringgrade;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getGrade() {
returngrade;
}
publicvoid setGrade(String grade) {
this.grade = grade;
}
}
publicclass Test {
publicstaticvoid main(String[]args){
Girl girl =new Girl();
girl.setGrade("高二三班");
girl.setName("小红红");
Proxy proxy =new Proxy(girl);
proxy.GiveChocolate();
proxy.GiveDolls();
proxy.GiveFlowers();
}
}
动态代理(利用Java反射机制)
package com.dao;
public interface StudentDao {
publicvoid saveStudent(String name,intage);
public String queryStudent();
}
2、学生实现类
package com.dao.impl;
import com.dao.StudentDao;
publicclass StudentDaoImpl implements StudentDao{
@Override
publicvoid saveStudent(String name,int age){
System.out.println("保存学生:name:"+name+",age:"+age);
}
@Override
public String queryStudent() {
System.out.println("查询学生...");
return"查询结果";
}
}
3、代理类
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//1、实现InvocationHandler接口
publicclass DAOProxy implements InvocationHandler{
privateObjectoriginalObject;
publicObject bind(Object obj){
this.originalObject = obj;
//2、返回代理实例,newProxyInstance是Proxy类的一个静态方法,参数分别是:实现类的类加载器、实现类的接口类、InvocationHandler对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
@Override
//3、实现invoke方法(执行任何一个被代理的实体类方法都会默认自动调用invoke方法)
publicObject invoke(Object proxy, Method method,Object[] param) throws Throwable {
Object result =null;
System.out.println("调用实现类方法之前所做的操作....");
result = method.invoke(this.originalObject, param);
System.out.println("调用实现类方法之后所做的操作....");
return result;
}
}
说明:
1、method.invoke(this.originalObject, param):
4、测试:
package com.main;
import com.dao.StudentDao;
import com.dao.impl.StudentDaoImpl;
import com.proxy.DAOProxy;
publicclass Main {
publicstaticvoid main(String[]args){
StudentDao sDao =new StudentDaoImpl();
DAOProxy proxy =new DAOProxy();
//proxy.bind()返回了一个代理实例
sDao = (StudentDao)proxy.bind(sDao);
sDao.saveStudent("吴帝永",27);
String result = (String)sDao.queryStudent();
System.out.println(result);
}
}
动态代理(利用cglib)
package com.dao;
public abstract class StudentDao {
public abstract void saveStudent(String name,int age);
public abstract String queryStudent();
}
package com.dao.impl;
import com.dao.StudentDao;
publicclass StudentDaoImpl extends StudentDao {
@Override
publicvoid saveStudent(String name, int age) {
System.out.println("保存学生:name:" + name + ",age:" + age);
}
@Override
public String queryStudent() {
System.out.println("查询学生...");
return"查询结果";
}
}
package com.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//1、实现MethodInterceptor接口
publicclass DAOCglibProxy implements MethodInterceptor{
private ObjectoriginalObject;//好像用不上哦
public Object bind(Object obj){
this.originalObject = obj;
Enhancer enhancer =new Enhancer();
//2、设置父类
enhancer.setSuperclass(obj.getClass());
//3、设置回调函数
enhancer.setCallback(this);
return enhancer.create();
}
@Override
//4、重写拦截器
public Object intercept(Object obj, Method method, Object[] params,MethodProxy proxy) throws Throwable {
Object object =null;
System.out.println("调用之前....");
object = proxy.invokeSuper(obj, params);
System.out.println("调用之后....");
return object;
}
}
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- Eclipse引入jar包的三种方式
- [MFC学习笔记]--MSG结构体
- 数据库多表连接查询
- Hello World驱动
- Oracle中删除用户下所有对象
- 代理模式
- gradle批量签名打包
- 玩转Xcode之修改系统生成的注释模板
- Android 学习之Fragment的创建
- 驱动程序如何手动卸载与更新
- 数据结构实验之队列一:排队买饭
- Automatic Preferred Max Layout Width is not available on iOS versions prior to
- MYSQL自定义排序
- jQuery_统计图插件-jscharts