设计模式——代理模式
来源:互联网 发布:seo营销工具 编辑:程序博客网 时间:2024/05/29 15:20
代理模式
概述:
代理模式为另一个对象(被代理对象)提供一个替身或占位符(代理对象)以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程对象,创建开销大的对象或者需要安全控制的对象。
作用:
1. 远程代理控制对远程对象的访问
2. 虚拟代理控制访问创建开销大的资源
3. 保护代理基于控制权限控制对资源的访问
主要角色:
1. 客户对象:客户对象以为自己在和真正实现功能的对象沟通(被代理对象),其实他只是在和代理对象沟通。
2. 代理对象:中间角色,将自己伪装成被代理对象
3. 被代理对象:真正实现功能的对象
类图:
代理模式与装饰模式的比较
1. 结构很相似,都是用一个对象把另一对象包起来,然后委托给具体处理类。
2. 目的不同,装饰者为对象增加行为,代理控制对象的访问
代理模式与适配器模式的比较
1. 都是挡在其他对象前,并负责将请求转发给他们
2. 适配器会改变对象适配的接口,代理实现相同的接口
Java中的动态代理
1. Proxy由java产生,并实现了完整的subject接口。提供invocationHandler响应代理的任何调用。也就是proxy上的任何方法都会被传入此类,invocationHandler控制对RealSubject的访问。
2. 动态代理的实现
a) 主题接口 Subject
package com.proxy;
public interface Subject {
void func();
}
b) 真实主题 RealSubject
package com.proxy;
public class RealSubject implements Subject{
@Override
public void func() {
System.out.println("真实对象中的处理方法");
}
}
c) 实现调用处理器并创建代理类 MyInvocationHandler
package com.proxy;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
public class MyHandler implementsInvocationHandler{
Subject sub; //被代理对象
public MyHandler(){}
publicMyHandler(Subject sub){
this.sub=sub;
}
@Override
public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {
// TODO Auto-generated method stub
System.out.println("响应代理的调用,控制对真实对象的访问");
System.out.println("访问真实对象前需要处理的事。。。。。。。");
method.invoke(sub, args);//响应代理的调用
System.out.println("访问真实对象后处理的事........");
return null;
}
//该方法需要一个Subject对象作为参数,然后返回它的代理
public Subject getRealSubjectProxy(Subject sub){
return (Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(),//被代理类的类加载器
sub.getClass().getInterfaces(),//代理需要实现的接口
new MyHandler(sub));//代理需要实现的接口
}
}
3. 输出结果
响应代理的调用,控制对真实对象的访问
访问真实对象前需要处理的事。。。。。。。
真实对象中的处理方法
访问真实对象后处理的事
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式—代理模式
- 设计模式——代理设计模式
- 设计模式——代理设计模式
- 每日设计模式——代理模式
- 学习设计模式——代理模式
- java设计模式——代理模式
- 设计模式——策略、代理模式
- 设计模式——代理模式(Proxy)
- 设计模式——代理模式
- node.js 获取url中的各个参数
- Tomcat部署时war和war exploded区别
- 乱码问题
- [BZOJ]1819: [JSOI]Word Query电子字典 trie+链表
- Java Double类型如何不科学计数法显示
- 设计模式——代理模式
- 数据结构与算法C++描述(3)---间接寻址
- Mybaits架构设计及其原理剖析
- Unity物体绕圆运动-轨迹
- python-在Windows下使用virtualenv
- OSI参考模型中各层的作用
- Eclipse中的项目名后NO-HEAD、项目名后不显示maven.日期版本号的问题
- WM修改屏幕分辨率 —加快手机运行速度—一机也能做适配
- YTU.1317: 控制台表格