设计模式读书笔记之代理模式(Proxy)
2016-04-25 09:22
459 查看
代理模式: 为其他对象提供代理以控制对该对象的访问.
示例代码:
[java] view
plain copy
//公共接口
package designpattern.proxy;
public interface Subject {
public void request();
}
//被代理类
package designpattern.proxy;
public class RealSubject implements Subject{
public void request() {
System.out.println("message from real object.");
}
}
//代理类
package designpattern.proxy;
public class ProxySubject implements Subject{
private Subject real;
public void request() {
preRequest();
if(real==null){
real = new RealSubject();
}
real.request();
postRequest();
}
private void preRequest(){
System.out.println("do something before request comes.");
}
private void postRequest(){
System.out.println("do something after request done.");
}
}
//test case
package designpattern.proxy;
public class Test {
public static void main(String[] args) {
Subject s = new ProxySubject();
s.request();
}
}
经典案例:
在hibernate中Session.load(Class, id)加载的对象就是实际对象的代理对象,只有真正需要这个对象的时候才从数据库中查询。
jdk动态代理:
[java] view
plain copy
public class Test {
public static void main(String[] args){
Object o = Proxy.newProxyInstance(
TT.class.getClassLoader(),
new Class<?>[]{Subject.class},
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("This is the proxy for method " + method.getName());
return null;
}
}
);
Subject s = (Subject)o;
s.request();
}
}
适应场景:远程代理, 安全代理
示例代码:
[java] view
plain copy
//公共接口
package designpattern.proxy;
public interface Subject {
public void request();
}
//被代理类
package designpattern.proxy;
public class RealSubject implements Subject{
public void request() {
System.out.println("message from real object.");
}
}
//代理类
package designpattern.proxy;
public class ProxySubject implements Subject{
private Subject real;
public void request() {
preRequest();
if(real==null){
real = new RealSubject();
}
real.request();
postRequest();
}
private void preRequest(){
System.out.println("do something before request comes.");
}
private void postRequest(){
System.out.println("do something after request done.");
}
}
//test case
package designpattern.proxy;
public class Test {
public static void main(String[] args) {
Subject s = new ProxySubject();
s.request();
}
}
经典案例:
在hibernate中Session.load(Class, id)加载的对象就是实际对象的代理对象,只有真正需要这个对象的时候才从数据库中查询。
jdk动态代理:
[java] view
plain copy
public class Test {
public static void main(String[] args){
Object o = Proxy.newProxyInstance(
TT.class.getClassLoader(),
new Class<?>[]{Subject.class},
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("This is the proxy for method " + method.getName());
return null;
}
}
);
Subject s = (Subject)o;
s.request();
}
}
适应场景:远程代理, 安全代理
相关文章推荐
- 笔记:基于标签的推荐系统、基于图的推荐算法、PersonalRank
- 四大关键步骤掌握CloudOps模型
- 关于Redis info的参数总结
- 7z源码分析
- PS制作逼真的海市蜃楼效果图
- 使用Symantec代码签名证书对代码进行签名的 5 个理由
- 小型系统管理器
- php产生随机数函数
- uva 497 Strategic Defense Initiative
- unity3d问题集 对Vector3.Lerp 插值的理解 - 转自蛮牛
- 148. Sort List
- java简单排序之冒泡排序
- 设计的7条心理学原则和定律
- 设计模式读书笔记之模版方法模式(Template)
- 设计模式读书笔记之外观模式/门面模式(Facade)
- 树状数组
- 这些情况,去面试就是浪费时间!
- 第二章 知识图谱——机器大脑中的知识库
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
- 资源 genymotion-2.6.0-vbox.exe不能下载的解决方案