拦截器的设计思想——代理模式

代理模式:静态代理和动态代理

1.代理类和被代理类必须实现同一个借口

2.代理类和别代理类有一种关联关系

静态代理:

例如实现一个日志:

  //定义一个接口

  public interface UserDao{

    public void delete();

  }

  //定义一个实现类

  public class UserDaoImpl implements UserDao{

    public void delete(){

      System.out.pritln("成功删除");

    }

  }

  //定义一个代理类

  public class LoggingProxy implements UserDao{

    Logger logger = Logger.getLogger(this.getClass().getName());

    UserDao dao;

    public LoggingProxy(UserDao dao){

      this.dao = dao;

    }  

    public void delete(){

      logger.log(Level.INFO,"删除之前");

      dao.delete();

      logger.log(Level.INFO,"删除之后");

    }

  }

  //定义一个测试类

  public class Test{

    public static void main(String args[]){

      LoggingProxy proxy = new LoggingProxy (new UserDaoImpl());

      proxy.delete();

    }

  }

  弊端:一个代理只能服务于一种类型的对象,系统很大时代理类会很多

动态代理:

 //定义一个接口

  public interface UserDao{

    public void delete();

  }

  //定义一个实现类

  public class UserDaoImpl implements UserDao{

    public void delete(){

      System.out.pritln("成功删除");

    }

  }

  //定义一个代理类

  public class DynamicProxy implements InvocationHandler{//必须实现这个接口

    Logger logger = Logger.getLogger(this.getClass().getName());

    Object delegate;

    //代理类和被代理类的绑定,返回的是目标接口

    public Object bind(Object obj){

      this.delegate = obj;

      Class cls = this.delegate.getClass();

      return Proxy.newProxyInstance(cls.getClassLoader(),cls,getInterfaces(),this);

    }  

    //反射机制,动态来调用代理类

    public Object invoke(Object proxy,Method method, Object[] args) throws Throwable{

      logger.log(Level.INFO,"删除之前");

      Object obj = method.invoke(delegate,args);

      dao.delete();

      logger.log(Level.INFO,"删除之后");

      return obj;

    }

  }

  //第二个代理接口

  public inteface CustomerDao{

    public String update(String username);

  }

  //第二个代理实现类

  public class CustomerDaoImpl implements CustomerDao{

    public String update(String username){

      System.out.pritln(username+"更新成功");

      return "success";

    }

  }

  //定义一个测试类

  public class Test{

    public static void main(String args[]){

      UserDo dao = (UserDao)new DynamicProxy().bind (new UserDaoImpl());

      dao.delete();

    

      CustomerDao dao2 = (CustomerDao)new DynamicProxy().bind(new CustomerDaoImpl());

      String str = dao2.update("amaker");

      System.out.pritln(str);

    }

  }

时间: 2024-10-04 15:32:13

拦截器的设计思想——代理模式的相关文章

设计思想与模式之四静态代理模式

一 概述 1.什么是代理模式? 为了隐藏与保护目标对象,为其他对象提供一个代理以控制对该目标对象的访问. 2.什么是静态代理模式? 代理模式有两种: 静态代理:代理对象固定. 动态代理:代理对象不固定. 二 静态代理模式 1.基本结构: 父类:可以是一个接口.抽象类.一般类,一般是接口,保证可以按照操作目标对象的方式操作代理对象. 目标类:实现了父类. 代理类:不仅拥有与目标相同的父类,而且包含目标类对象. 2.代理类包含目标对象的实现 代理模式的作用是隐藏与保护目标对象,因此目标对象不能由用户

拦截器(由JDK动态代理实现的拦截器)

要实现拦截器,首先我们需要定义几个类和接口 package com.xiawei.reflect.interceptor; public interface JavaBenDao { public void look();} ================================================== package com.xiawei.reflect.interceptor; public class JavaBenDaoImpl implements JavaBen

拦截器都是通过代理的方式调用,是AOP的一种实现

当请求到达Struts2的ServletDispatcher时,Struts2根据配置文件,实例化相对应的拦截器对象,形成一个List,一个一个调用. 每个action请求都包装在一系列的拦截器内部,拦截器可以在Action执行之前做准备操作init(),可以在Action执行之后做回收操作destroy(),可以将操作转交给下面的拦截器invoke(),也可以直接退出操作return Action.字符串常量,返回客户已定的视图资源. 自定义拦截器类有两种方法:实现Interceptor接口,

java设计优化--代理模式

代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为了提升系统,对真是对象进行封装,从而达到延迟加载的目的. 在系统启动时,将消耗资源最多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间.在用户真正在做查询是,再由代理类加载真实的类,完成用户请求.这就是使用代理模式达到延迟加载的目的. 1.静态代理实现: 主题接口: 1 publ

C#面向对象设计之——代理模式(十三)

一.前言 代理模式是为其他对象提供一种代理以控制对这个对象的访问. 二.结构图 三.实例代码 namespace 代理模式 { class Program { static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); Console.Read(); } } abstract class Subject { public abstract void Request(); } class RealSub

面向对象编程思想-代理模式

一.引言 在系统开发过程中,大多会遇到跨网络做系统应用间数据对接问题,但目标对象不允许跨网络直接访问数据,通常考虑到网络和安全性能等因素,开发者会在客户端和目标对象间添加一层中间层--代理层,也是即将要介绍的代理模式(Proxy). 二.代理模式介绍 在介绍代理模式前,我们首先看一下代理模式的分类 1.远程(Remote)代理:为一个位于不同地址空间的对象提供局部代表对象,隐藏一个对象存在于不同地址空间的事实. 典型例子:webservice在.NET中的应用,在应用程序项目中加入web引用,引

记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一. 1. JAVA中代理的概念 动态代理技术就是用来产生一个对象的代理对象的.直接说好像也很迷糊,好像用不上的样子. (下面的例子部分来自互联网) 举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人.比如王宝强在现实生活中非常有名,会唱歌,会跳舞,会拍戏.王

设计思想与模式之二适配器模式

1.什么是适配器模式? 适配器模式是一种过渡模式,用于沟通两个不兼容的事物,实现信息交换. 2.适配器模式的目的 使一个对象能够以一种相对简单的方式处理多个不同类型的对象,即一个对象兼容多个不同类型的对象.例如,电脑接收外部硬件的插口唯一确定,不同尺寸的内存卡先插到读卡器上,再由读卡器插到唯一确定的插口上.读卡器就充当了适配器的角色,不同的内存卡拥有不同的读卡器,由于不同的读卡器面对的是相同的插口,因此不同的读卡器拥有共同的特性,在程序中就表现为适配器实现共同的接口,体现了接口的可插拔特性. 3

设计思想与模式之五观察者模式

一 概述 1.什么是观察者模式? 将一个对象视作被观察者,当它发出某种行为或者发生某种变化时,通知所有依赖它的对象(观察者),这种设计模式叫做观察者设计模式. 2.观察者设计模式的用途 用于处理一对多的依赖关系,当一个对象的状态发生改变时,通知所有依赖于它的对象,这些对象收到通知以后采取相应的处理措施. 二 观察者模式构成 被观察者接口:包含添加观察者.删除观察者.通知观察者等操作. 被观察者:实现了被观察者接口,一个具体的被观察者. 观察者接口:处理被观察者的通知. 观察者:实现了观察者接口,