当前位置: 首页 > news >正文

行为模式--代理Proxy模式(Java)

代理(AOP切面的雏形):

题记:顾名思义就是将某件事,某个东西的使用权进行为让授权转移。代理相当于中介(不同于中介者模式),在原本操作的类之间添加了一个桥梁。但代理不能去修改原有目标。比如:一个人要买       房,让中介帮忙给看个房,但中介不能将原有看房这件事变更为看车。他可以对看房提出各种要求和咨询。

回到程序的角度,调用者将调用某些共性类的处理交由代理类处理,代理类根据调用者的要求即满足什么情况可以调用,什么情况不能调用,(卖房者委托中介100万以上卖,100万以下不卖)对处理做前后的包装,但是代理类不能去改变被调用类的内部处理(可口可乐中国区可修改可口可乐包装,但不能在没授权情况下去更改可口可乐饮料)。

1.静态代理

2.动态代理

1.静态代理:对指定接口类做代理,通过对执行方法前后做处理,来实现代理的作用。因对指定接口类,因此可做某些特定类的特殊处理。

 1 /**
 2  * 静态代理,也被称为decate模式
 3  * 
 4  * @author DennyZhao
 5  * @date 2017年6月13日
 6  * @version 1.0
 7  */
 8 public class AnimalProxyFactory implements AnimalFactory {
 9     /**
10      * 序列号
11      */
12     private static final long serialVersionUID = -3421761900236678842L;
13     
14     
15     private AnimalFactory animal;
16     
17     public AnimalProxyFactory(AnimalFactory animal){
18         this.animal = animal;
19     }
20     @Override
21     public int getLegs() {
22         System.out.println("before....action");
23         int legs = animal.getLegs();
24         System.out.println("after....action");
25         return legs;
26     }
27 
28 }
View Code

测试Main:

  // 静态代理
  Rabit rabit = new Rabit();
  AnimalProxyFactory proxyFactory = new AnimalProxyFactory(rabit);
  System.out.println(proxyFactory.getLegs());    

运行结果: 

  >>>before....action
  >>>after....action
  >>>4  

       2.动态代理:动态代理通过Proxy类创建代理,通过InvokationHandler去调用方法。

 1 package pattern.creation.factory;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.lang.reflect.Proxy;
 7 import java.util.Properties;
 8 
 9 /**
10  * 动态代理模式
11  * 
12  * @author DennyZhao
13  * @date 2017年6月13日
14  * @version 1.0
15  */
16 public class ProxyFactory {
17     private static final String CLASS_NAME_PATH = "pattern/classname.properties";
18     @SuppressWarnings("unchecked")
19     public static <T> T getInstance(String name) throws IllegalArgumentException, InstantiationException, IllegalAccessException{
20         String className = getClassName(name);
21         T result = null;
22         try {
23             Class clazz = Class.forName(className);
24             result = (T)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new MyInvocationHandler(clazz.newInstance()));
25         } catch (ClassNotFoundException e) {
26             e.printStackTrace();
27         }
28         return result;
29     }
30 
31     /**
32      * 获取类名称
33      * @return
34      */
35     private static String getClassName(String name) {
36         Properties pro = new Properties();
37         try {
38             String url = ProxyFactory.class.getClassLoader().getResource("").getPath() + CLASS_NAME_PATH;
39             pro.load(new FileInputStream(url));
40         } catch (FileNotFoundException e) {
41             e.printStackTrace();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45         return (String)pro.get(name);
46     }
47 }
View Code

     注意* : 代理面向的是接口,因此委托的类都需要实现指定的接口。

      result = (T)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new MyInvocationHandler(clazz.newInstance()));

       clazz.getInterfaces():如果一个clazz实现多个接口,此处要传入接口Class。

      MyInvocationHandler 实现 InvocationHandler接口,里面要实现一个invoke方法,在这个invoke方法中填写处理。

MyInvocationHandler 

// 可通过放射机制,来处理特殊类的特殊请求。

测试Main:

// 动态代理,AOP切面的雏形做法
AnimalFactory sheep = ProxyFactory.getInstance("sheep");
sheep.getLegs();

// 动态代理,AOP切面的做法
PlantFactory plum = ProxyFactory.getInstance("plum");
plum.getColor();

// 动态代理,AOP切面的做法
AnimalFactory rabit0 = ProxyFactory.getInstance("rabit");
rabit0.getLegs();

结果:

before-------
sheep has 4 legs....
after-------
before-------
plum green purple....
after-------
before-------
兔子是特殊的
after-------

 

转载于:https://www.cnblogs.com/DennyZhao/p/7049945.html

相关文章:

  • python 类的特殊成员
  • 修改敏感字
  • Java内部类
  • $.ajax中的eval及dataType
  • https 安全验证问题
  • 平安科技移动开发二队技术周报(第八期)
  • ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
  • codevs 2074 营救 WW
  • 范式1F2F3F
  • 品牌管理之万变与不变——From 品牌管理培训
  • Nginx(四)-- 配置文件之location
  • 自定义View中的Path
  • PHP 从数组中删除指定元素
  • Hadoop 尝试
  • jQuery淡入淡出的轮播图
  • $translatePartialLoader加载失败及解决方式
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 345-反转字符串中的元音字母
  • bearychat的java client
  • Git的一些常用操作
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java第三方包学习之lombok
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux各目录及每个目录的详细介绍
  • Python_OOP
  • Redis 懒删除(lazy free)简史
  • select2 取值 遍历 设置默认值
  • springMvc学习笔记(2)
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何进阶一名有竞争力的程序员?
  • 如何胜任知名企业的商业数据分析师?
  • 使用parted解决大于2T的磁盘分区
  • 首页查询功能的一次实现过程
  • 我是如何设计 Upload 上传组件的
  • 学习HTTP相关知识笔记
  • 用element的upload组件实现多图片上传和压缩
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ###项目技术发展史
  • #include
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Python) SOAP Web Service (HTTP POST)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (论文阅读40-45)图像描述1
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)大道至简,职场上做人做事做管理
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET CORE 3.1 集成JWT鉴权和授权2