Java 代理模式
来源:互联网 发布:挂载linux是什么 编辑:程序博客网 时间:2024/05/15 20:15
转自:http://blog.csdn.net/guojun828/article/details/6155971
定义 为其它对象提供一种代理以控制对这个对象的访问
类图
[Java] view plain copy
- 通用代码
- 抽象主题类
- public interface Subject {
- public void request();
- }
- 真实主题类
- public class RealSubject implements Subject {
- @Override
- public void request() {
- //具体业务处理
- }
- }
- 代理类
- public class Proxy implements Subject {
- //要代理哪个实现类
- private Subject subject = null;
- //默认被代理者
- public Proxy(){
- this.subject = new Proxy();
- }
- //通过构造函数传递代理者
- public Proxy(Object...args){
- }
- //实现接口中定义的方法
- @Override
- public void request() {
- this.before();
- this.subject.request();
- this.after();
- }
- //预处理
- private void before(){
- }
- //善后处理
- private void after(){
- }
- }
优点
1. 职责清晰 真实的角色就是实现的业务逻辑,不用关心其他非本指责的事务
2. 高扩展性 具体主题角色不能怎么变化,只要它实现了接口,代理类完全可以在不做任何修改的情况下使用
3. 智能化 动态代理是最好的体现,即在运行阶段才指定实际代理对象(Struts如何把表单元素映射到对象上?)
使用场景 典型应用如spring AOP
扩展
1. 普通代理 要求客户端只能访问代理角色,而不能访问真实角色
2. 强制代理 要求客户端必须通过真实角色找到代理角色(演员和经纪人)
3. 虚拟代理 指在需要的时候,才初始化主题对象,可以避免被代理对象太多而引起的初始化缓慢问题
[java] view plain copy
- public class Proxy implements Subject{
- Private Subject subject;
- public void request(){
- If(subject==null){
- Subject = new RealSubject();
- }
- subject.request();
- }
- }
1. 动态代理 指在实现阶段不用关心代理谁,而在运行阶段才指定代理哪个对象,动态代理根据被代理的接口生成所有的方法即给定一个接口,动态地理就宣传我已经实现该接口下的所有方法了(通过InvocationHandler接口)
类图
[java] view plain copy
- 源码
- 1. 接口
- public interface IGamePlayer {
- public void login(String user,String password);
- public void killBoss();
- public void upgrade();
- }
- 2. 实现类
- public class GamePlayer implements IGamePlayer {
- private String name="";
- public GamePlayer(String _name){
- this.name=_name;
- }
- @Override
- public void killBoss() {
- System.out.println(this.name+"在打怪");
- }
- @Override
- public void login(String user, String password) {
- System.out.println("登录名为"+user+"的用户 "+this.name+"登录成功");
- }
- @Override
- public void upgrade() {
- System.out.println(this.name+"又升了一级");
- }
- }
- 3. 动态代理类
- public class GamePlayIH implements InvocationHandler {
- //被代理者
- Class cls =null;
- //被代理的实例
- Object obj=null;
- //我要代理谁
- public GamePlayIH(Object _obj){
- this.obj=_obj;
- }
- //调用被代理的方法
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result =method.invoke(this.obj, args);
- if(method.getName().equalsIgnoreCase("login")){
- System.out.println("有人登录");
- }
- else if(method.getName().equalsIgnoreCase("upgrade")){
- System.out.println("有人升级了");
- }
- return result;
- }
- }
- 4. 场景类
- public class Client {
- public static void main(String[] args) {
- IGamePlayer player = new GamePlayer("郭俊");
- InvocationHandler handler = new GamePlayIH(player);
- System.out.println("开始打游戏,记下时间戳 : "+System.currentTimeMillis());
- ClassLoader c1=player.getClass().getClassLoader();
- //动态生成一个代理类
- IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(c1, new Class[]{IGamePlayer.class}, handler);
- proxy.login("guojun", "password");
- proxy.killBoss();
- proxy.upgrade();
- System.out.println("结束时间是:"+System.currentTimeMillis());
- }
- }
阅读全文
1 0
- Java代理之代理模式
- java代理模式---静态代理
- java代理模式--动态代理
- 代理模式&java动态代理
- JAVA代理模式--静态代理
- JAVA代理模式--动态代理
- JAVA动态代理 代理模式
- Java代理模式-静态代理
- java代理模式-动态代理
- Java代理模式 静态代理 动态代理
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- Java代理模式和kotlin代理模式
- Java中的代理模式
- 高德地图多点标记 marker JSAPI
- 将excel表格数据转换为xml文本数据
- 【ubuntu】ubuntu14.04卡在开机页面
- 比解决问题更重要的东西
- 51 nod 1073 约瑟夫环
- Java 代理模式
- 【C/C++开发】C++编译指令#pragma pack的配对使用
- Python类的方法(method):super的用法
- linux 下使用 tc 模拟网络延迟和丢包
- Java基础之HashMap阅读总结
- NVcaffe源码阅读——Net&Solver
- 前序和中序序列重建二叉树
- C++并发编程——在运行时选择线程数量
- QT-程序分辨率和居中显示