每天一点积累(七)--代理模式
来源:互联网 发布:java中nio的用法 编辑:程序博客网 时间:2024/05/21 06:26
代理模式分为动态代理和静态代理
静态代理
静态代理就是在代码实现中相当于为一个委托对象realSubject提供一个代理对象proxy,通过proxy可以调用realSubject的部分功能,并添加一些额外的业务处理,同时可以屏蔽realSubject中未开放的接口。
1、RealSubject 是委托类,Proxy 是代理类;
2、Subject 是委托类和代理类的接口;
3、request() 是委托类和代理类的共同方法;
具体代码实现如下:
interface Subject { void request();}class RealSubject implements Subject { public void request(){ System.out.println("RealSubject"); }}class Proxy implements Subject { private Subject subject; public Proxy(Subject subject){ this.subject = subject; } public void request(){ System.out.println("begin"); subject.request(); System.out.println("end"); }}public class ProxyTest { public static void main(String args[]) { RealSubject subject = new RealSubject(); Proxy p = new Proxy(subject); p.request(); }}
静态代理实现中,一个委托类对应一个代理类,代理类在编译期间就已经确定。
动态代理
动态代理中,代理类并不是在Java代码中实现,而是在运行时期生成,相比静态代理,动态代理可以很方便的对委托类的方法进行统一处理,如添加方法调用次数、添加日志功能等等,动态代理分为jdk动态代理和cglib动态代理,下面通过一个例子看看如何实现jdk动态代理。
被代理对象
public interface Subject
{
public void hello(String str);
}
public class RealSubject implements Subject{
@Override
public void hello(String str)
{
System.out.println("你好:" + str);
}
}
代理方法
public class ProxyHandler implements InvocationHandler{
// 这个就是我们要代理的真实对象
private Object subject;
// 构造方法,给我们要代理的真实对象赋初值
public ProxyHandler(Object subject)
{
this.subject = subject;
}
@Override
public Object invoke(Object object, Method method, Object[] args)
throws Throwable
{
// 在代理真实对象前我们可以添加一些自己的操作
System.out.println("代理模式开始");
System.out.println("代理方法是" + method);
// 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(subject, args);
// 在代理真实对象后我们也可以添加一些自己的操作
System.out.println("代理结束");
return null;
}
//获取代理对象 调用newProxyInstance接口
public Object getProxy() {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<?>[] interfaces = subject.getClass().getInterfaces();
return Proxy.newProxyInstance(loader, interfaces, this);
}
}
测试
public class DynamicProxy {
public static void main(String[] args)
{
// 我们要代理的真实对象
Subject realSubject = new RealSubject();
// 我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
ProxyHandler handler = new ProxyHandler(realSubject);
Subject subject=(Subject)handler.getProxy();
subject.hello("帅牛");
}
}
运行结果
代理模式开始
代理方法是public abstract void com.xxx.Subject.hello(java.lang.String)
你好:帅牛
代理结束
- 每天一点积累(七)--代理模式
- 每天一点正则表达式积累之(?=X)和(?!X)测试(七)
- 每天一点Js(七)
- 每天一点正则表达式积累(三)
- 每天一点正则表达式积累(四)
- 每天一点正则表达式积累(五)
- 每天一点正则表达式积累(六)
- 每天积累一点
- 每天一点积累
- 每天积累一点(八)--GC
- 每天积累一点(二)--mysql事物级别
- 每天一点积累(一二)---JVM之GC垃圾回收
- 每天一点积累(一五)--类继承的加载
- 每天一点hadoop 第十一篇 HDFS(七)
- 每天一点积累(三)--mysql存储引擎
- 每天一点积累(九)---JVM前提堆栈
- 每天一点积累(十)---JVM加载class
- java设计模式(七)---代理模式
- 《并发编程》--6.Java内存模型(JMM)的关键字volatile
- CSS中的属性
- 关闭内核中的CPU的开启关闭提示:CPU1: Booted secondary processor(分色排版)
- python--wxpython实现UI窗口实例
- android 获取系统日期 时间
- 每天一点积累(七)--代理模式
- Spring Mvc ,各种解析器 及 struts2 区别
- 浅谈iOS视频播放的N种解决方案
- 机器学习入门了解(好文!)
- 图文教你简单将PDF转CAD格式
- map
- NYOJ 16 矩形嵌套(DAG上的动态规划)
- oracle 11.2.0.1 for windows installation
- 设置TableView的header和footer