行为模式--代理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 }

测试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 }

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

      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-------

时间: 2024-12-18 09:58:28

行为模式--代理Proxy模式(Java)的相关文章

Java设计模式(四) 装饰器模式 代理器模式

(七)装饰器模式 Decorator 装饰器模式是为了动态的给一个对象增加一些新功能.装饰对象与被装饰的对象需要实现同一个接口,装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"

设计模式 之代理(Proxy)模式

为什么这里要定义代理呢?所谓代理代理,当然就是你不想做的事,找别人去做,这就是代理.所以,当你写代码的时候,你想保持类的简单性.重用性,你就可以把事件尽量都交给其它类去做,自己只管做好自己的事.也就是SRP,单一职责原则.如果一个类关注的点过多,做的事情太多.这些事情不管是你直接做的,还是调用别的对象去完成的.这都不行,自己做这些事,那就会使类的功能复杂化,维护不方便.而过多地调用其它对象来完成一些事情,表面上看起来好像不错,实际上是过度耦合了.我们编写类的原则应该是追求高内聚,低耦合的.可能你

Android中的代理(Proxy)模式

一. Proxy模式定义 Proxy模式,也称代理模式,是经典设计模式中的一种结构型模式,其定义是为其他对象提供一种代理以控制对这个对象的访问,简单的说就是在访问和被访问对象中间加上的一个间接层,以隔离访问者和被访问者的实现细节. 二. Proxy模式理解 当无法或者不想直接访问某个对象, 或者访问某个对象存在困难时, 可以通过一个代理对象来间接访问, 为了保证客户端使用的透明性, 委托对象与代理对象需要实现相同的接口. 例如,ActivityManager 作为客户端要访问 AMS,AMS 不

Java代理模式(Proxy模式)

理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 设计模式中定义:为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用代理模式 授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授

Java 实现代理(Proxy)模式

/** * 游戏者接口 * @author stone * */ public interface IGamePlayer { // 登录游戏 public void login(String user, String password); // 杀怪,网络游戏的主要特色 public void killBoss(); // 升级 public void upgrade(); } /** * 游戏者 * @author stone * */ public class GamePlayer imp

Android与设计模式——代理(Proxy)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构. 所谓代理,就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式类图如下: 在代理模式中的角色: ●抽象对象角色(Phone):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象

代理(Proxy)模式

代理模式的类图如下所示: 客户端想调用的是RealSubject,由于某种考虑或原因,只能直接访问到ProxySubject,再由ProxySubject去调用RealSubject,这就完成了一次代理的活动. 代理模式的时序图如下: 从上面可以看出,ProxySubject不仅可以完成对RealSubject的调用,在调用前后还可以完成一些事情,这就是代理模式的优点. 代理模式按照使用的分类,可以分为以下几类: 远程代理:为一个不同地址空间的对象提供一个局域代表对象. 虚拟代理:根据需求创建一

设计模式--代理(Proxy)模式

在公司,经常性听到采购部的人说采购某样东材料,采购不了,需要通过代理商才可以.以前Insus.NET也做有一个练习<找人办事,代理设计模式(Proxy)>http://www.cnblogs.com/insus/archive/2013/02/27/2935081.html .理解起来跟公司的采购员找代理商采购是一样的道理. 统一的行为,就是采购,不管是公司的采购员还是代理商: 公司的采购员: 代理商: OK,实现环境: 演示: 代理模式实际环境中很多.比如我们想租或买房,均可以让代码帮助我们

c++ 结构型模式-代理(Proxy)

1) 意图: 为其他对象提供一种代理以控制对这个对象的访问 2) 结构: 其中: Subject定义了 Proxy 和 RealSubject 的公有接口 Proxy 保存一个引用,实现代理访问实体 RealSubject定义了实体 3) 适用性: 复杂的指针代替简单的指针的时候,例如:远程代理.虚代理.保护代理... 4) 举例: 1 #include <iostream> 2 #include <list> 3 class Subject 4 { 5 public: 6 Sub