代理模式(动态代理)

  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/Dog.java
package nuc.sw.dynamic.proxy;public interface Dog {public void info();public void run();public void cry();
}
  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/DogImpl.java
package nuc.sw.dynamic.proxy;public class DogImpl implements Dog {@Overridepublic void info() {// TODO Auto-generated method stubSystem.out.println("一只薛皮皮");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("薛皮皮骑着Clearlove7的猪跑了");}@Overridepublic void cry() {// TODO Auto-generated method stubSystem.out.println("薛皮皮成为嚎哭深渊领主");}}
  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyInterceptor.java
package nuc.sw.dynamic.proxy;public class MyInterceptor {public void method1() {System.out.println("模拟Struts框架中访问action之前拦截器执行的代码");}public void method2() {System.out.println("模拟Struts框架中访问action之后拦截器执行的代码");}
}
  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyProxyFactory.java
package nuc.sw.dynamic.proxy;import java.lang.reflect.Proxy;public class MyProxyFactory {public static Object getProxy(Object object,String methodName) {ProxyHandler handler=new ProxyHandler(object, methodName);return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);      }
}
  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/ProxyHandler.java
package nuc.sw.dynamic.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class ProxyHandler implements InvocationHandler {private Object target;private String methodName;private MyInterceptor mi=new MyInterceptor();public ProxyHandler(Object target,String methodName) {                  this.target=target;this.methodName=methodName;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// TODO Auto-generated method stubObject result=null;if(method.getName().equals(methodName)) {mi.method1();result=method.invoke(target, args);mi.method2();}else {result=method.invoke(target, args);}return result;}}
  • /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/TestDynamicProxy.java
package nuc.sw.dynamic.proxy;import nuc.sw.proxy.*;public class TestDynamicProxy {public static void main(String[] args) {// TODO Auto-generated method stub//案例一:狗代理//1.产生一个真实主题角色Dog dog=new DogImpl();//2.代理主题角色Dog dogProxy=(Dog) MyProxyFactory.getProxy(dog, "info");        //3.通过代理主题角色访问真实主题角色方法dogProxy.info();dogProxy.run();dogProxy.cry();//案例二BookAbstractSubject publisher=new Publisher();BookAbstractSubject publisherProxy=(BookAbstractSubject)MyProxyFactory.getProxy(publisher, "saleBook");publisherProxy.saleBook();}}
  • /20171030_chr_proxy/src/nuc/sw/proxy/BookAbstractSubject.java
package nuc.sw.proxy;public interface BookAbstractSubject {public void saleBook();
}
  • /20171030_chr_proxy/src/nuc/sw/proxy/Publisher.java
package nuc.sw.proxy;public class Publisher implements BookAbstractSubject{public void saleBook() {// TODO Auto-generated method stubSystem.out.println("真实主题角色出版社卖书");}public void makeBook() {System.out.println("真实主题角色出版社造书");}
}
  • /20171030_chr_proxy/src/nuc/sw/proxy/ShoppingOnline.java
package nuc.sw.proxy;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ShoppingOnline implements BookAbstractSubject{private Publisher publisher=new Publisher();public void presaleBook() {// TODO Auto-generated method stubSystem.out.println("代理主题角色网上商店买书前宣传");}public void postsaleBook() {System.out.println("代理主题角色网上商店卖书后售后服务");}public void saleBook() {// TODO Auto-generated method stub/*this.presaleBook();publisher.saleBook();this.postsaleBook();publisher.makeBook();*/this.invoke();}//获取真实主题角色的所有方法,如果方法名为saleBook,完成上面的活儿,否则不管(反射机制)public void invoke() {Method[] methods=publisher.getClass().getMethods();for(int i=0;i<methods.length;i++) {try {if(methods[i].getName().equals("saleBook")) {                               this.presaleBook();methods[i].invoke(publisher);this.postsaleBook();            }else {methods[i].invoke(publisher);                               }               } catch (IllegalAccessException e) {  } catch (IllegalArgumentException e) {} catch (InvocationTargetException e) {}   }}
}
  • /20171030_chr_proxy/src/nuc/sw/proxy/TextProxy.java
package nuc.sw.proxy;public class TextProxy {public static void main(String[] args) {// TODO Auto-generated method stubShoppingOnline so=new ShoppingOnline();//so.saleBook();so.invoke();}}

20171030_chr_proxy 代理模式(动态代理)相关推荐

  1. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  2. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  3. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

  4. Proxy 代理模式 动态代理 CGLIB

    代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...

  5. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  6. 【设计模式】代理模式 ( 动态代理 )

    文章目录 一.动态代理使用流程 二.动态代理代码示例 1.订单类 2.Service 接口 3.Service 实现类 4.Service 静态代理类 5.Dao 接口 6.Dao 实现类 7.Ser ...

  7. 代理模式(动态代理)

    动态代理.就是不用自己写代理类,只要实现接口就行了. 动态代理,这里介绍两种:jdk and cglib 第一个jdk //一个接口类 public interface Book{void read( ...

  8. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

  9. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  10. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. python中calendar怎么用_Python时间模块datetime、time、calendar的使用方法
  2. Deepin系统安装
  3. Spring @Autowired 注入为 null
  4. Could not read from remote repository
  5. 原创 MySQL探秘(八):基于Redo Log和Undo Log的MySQL崩溃恢复流程(一致性)
  6. cocos2d-x游戏开发(十一)细说场景切换
  7. 愚蠢的怪胎技巧:通过命令行管理SkyDrive
  8. 复数幂用java程序怎么求_蓝桥杯——复数幂 (2018JavaAB组第3题)
  9. Bzoj3576 [Hnoi2014]江南乐
  10. scipy —— 丰富的子包(io、cluster)
  11. 这些面试机会,你该主动放弃!
  12. java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除
  13. 天锐绿盾教您如何管控外接设备
  14. 11种绕过CDN查找真实IP方法(查找网站真实IP地址、查找域名真实IP)
  15. Android Compose 新闻App(五)Room复杂数据、AlertDialog弹窗、页面导航
  16. PHP字符串函数stripslashes(反引用一个addslashes转义的字符串)
  17. 【数论】Pollard-Rho 算法总结
  18. 大学一年级计算机组成语结构试题,一年级语文上册期末:词语类考题全面练习(汇总版)...
  19. Google镜像搭建:利用 Cloudflare Workers 搭建访问谷歌镜像站点,可自行绑定域名
  20. 笔记-知识产权与标准化知识-中华人民共和国政府采购法

热门文章

  1. jar 坐标系转换工具_java jar生成maven坐标
  2. 计算机平面设计创意教案,平面设计教案1
  3. 黑苹果NVIDIA显卡驱动程序【 WebDriver-387.10.10.10.40.135+支持 macOS 10.13.6 High Sierra (17G12034)版本】
  4. lambda函数if_Python中lambda的使用,与它的三个好基友介绍!
  5. 用Python的selenium库模仿人点击相关网页刷阅读量实例
  6. Unity 按键控制相机(移动、旋转、相机角度控制)
  7. linux rman删除备份,【RMAN】【RMAN命令】DELETE 命令(5)--删除特定备份集(不提示)
  8. 为什么用「void 0」代替「undefined」
  9. 51单片机STC89C52RC进阶 – 在面包板上构建51单片机最小系统
  10. 乌海计算机打印准考证,2016年下半年乌海计算机一级准考证打印入口及网址,计算机等级考试时间查询...