模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制

本文探讨了代理模式及其在软件工程中的应用,并通过具体代码实例展示了如何利用AOP思想和Java反射技术在不修改目标对象的情况下,在其执行前后添加额外方法。
先说说代理模式:是来源于我们传统的思想,比如,我想去青岛办一些事,但是人不在青岛,于是我委托在青岛的朋友代理我去办。软件中的代理模式可以有约束性代理,远程代理,缓存代理等。
AOP设计哲学-我们在软件工程中,往往从纵向思维去设计软件,比如传统的三层思想(表示层,业务层,数据层),但是我们来个横行的总结,比如日志系统可以横行贯穿于这三层之中。我们要把日志系统的设计就是面向切面编程的原理。
在AOP的编程方式中有三个重要的概念:
  • 目标对象,被拦截的原始对象
  • 被插入的处理方法:定义在拦截器中,会在被拦截方法之前,之后自动执行的方法。
  • 代理对象:以对象目标位蓝本,由系统创建的对象。
设想,我们怎样在不影响目标对象的业务逻辑的情况下,在目标对象的执行前或后去执行令一个方法,这里就利用AOP思想,java反射,动态构造。我们列举一个例子:
假设有一个宠物狗类,有两个方法,一个是Info方法(描述狗特征),一个run方法,我们怎样在info执行前,去执行类外的一个方法。我们第一思路就是修改宠物狗类,其实利用java的动态构造,反射,可以轻松实现,看代码:
Dog.java
package Intercepter;

public interface Dog {
       // target object
       public void info();
       public void run();
}
DogImpl.java
package Intercepter;

public class DogImpl implements Dog {

       @Override
       public void info() {
             // TODO Auto-generated method stub
            System. out.println( "I am a dog");
      }

       @Override
       public void run() {
             // TODO Auto-generated method stub
            System. out.println( "I am running");
      }

}
DogIntercepter.java
package Intercepter;

public class DogIntercepter {
       public void method1(){
            System. out.println( "excute the first method of Intercepter");
      }
       public void method2(){
            System. out.println( "excute the second method of Intercepter");
      }
}
ProxyHandler.java
package Intercepter;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler {

       private Object target;
      DogIntercepter intercepter = new DogIntercepter();
      
       @Override
       public Object invoke(Object proxy, Method method, Object[] args)
                   throws Throwable {
             // TODO Auto-generated method stub
            Object result = null;
             if(method.getName().equals( "info")){
                   // 调用拦截器方法1
                   intercepter.method1();
                   // 调用目标对象方法
                  result = method.invoke( target, args);
                   // 调用拦截器方法2
                   intercepter.method2();
            }
             else{
                  result= method.invoke( target, args);
            }
             return result;
      }
      
       public void setTarget(Object o){
             this. target=o;
      }
}
MyProxyFacotory.java
package Intercepter;

import java.lang.reflect.Proxy;

public class MyProxyFactory {
       public static Object getProxy(Object o){
            ProxyHandler handler =  new ProxyHandler();
            handler.setTarget(o);
             return Proxy.newProxyInstance(DogImpl. class.getClassLoader(), o.getClass().getInterfaces(), handler);
      }
}
ClientTest.java
package Intercepter;

public class ClientTest {
       public static void  main(String[] args) {
            Dog targetDog = new DogImpl();
            Dog dog = null;
            Object proxy = MyProxyFactory. getProxy(targetDog);
             if(proxy instanceof Dog){
                  dog=(Dog)proxy;
            }
            dog.info();
            dog.run();
      }
}
通过ProxyHandler的帮助,系统实现了在执行info之前,调用了拦截器中的方法。轻松实现了松耦合。


乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值