java中的静态和动态代理模式
2017-01-19 15:55
375 查看
一. 简介代理模式(Proxy Pattern)是23种Java常用设计模式之一。代理模式的定义:Provide a surrogate or placeholder for another 用代理模式创建代理对象,让代object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。使理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。二、静态代理1、首先创建一个借口 Humam,规定有唱歌,跳舞,吃饭三件事情
public interface Human { void sing(float money); void dance(float money); void eat(); }2、然后让一个人去实现这些功能public class Person implements Human {public void sing(float money) {System.out.println("拿到钱"+money+"开始唱歌");}public void dance(float money) {System.out.println("拿到钱"+money+"开始跳舞");}public void eat() {System.out.println("吃饭");} 3、静态代理就是创建出一个具体的代理类,通过这个代理类,去实现接中规定的方法,这里给Person设计一个经纪人Middleman Middleman有对这个Human做出了一些规定。
public class Middleman implements Human {private Human h;public Middleman(Human h) {this.h = h;}public void sing(float money) {if(money>1000){h.sing(money/2);}}public void dance(float money) {if(money>2000){h.dance(money/2);}}public void eat() {h.eat();}}4、测试
public static void main(String[] args){Human h = new Person();Human middleMan = new Middleman(h);middleMan.sing(10000);middleMan.dance(20000);middleMan.eat();}5、运行结果如下:
拿到钱5000.0开始唱歌拿到钱10000.0开始跳舞吃饭三、动态代理1、2步 。同上3、不需要代理类,在这个代码运行期间,动态的规定这些方法的实现。
public static void main(String[] args){//动态代理final Human h = new Person();/*** ClassLodder loader: 类加载器 和Person用相同的类* Inferface[] interfaces Person用相同的接口* InvocatoinHandler h :接口,设置代理,策略设计模式**/Human middleman = (Human) Proxy.newProxyInstance(h.getClass().getClassLoader(),h.getClass().getInterfaces(), new InvocationHandler() {//匿名内部类:具体策略//只要执行任何方法,都会经过这里/** 返回值:当前方法的返回值* Object proxy:当前代理对象的引用* Method method:当前执行的方法* Object[] args 当前执行方法的参数*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if("sing".equals(method.getName())){float money = (Float) args[0];if(money>1000){method.invoke(h, money/2);}}if("dance".equals(method.getName())){float money = (Float) args[0];if(money>2000){method.invoke(h, money/2);}}if("eat".equals(method.getName())){method.invoke(h, null);}return null;}});middleman.sing(10000);middleman.dance(20000);middleman.eat();}4、运行结果:拿到钱5000.0开始唱歌拿到钱10000.0开始跳舞吃饭
相关文章推荐
- JAVA 设计模式:静态代理VS动态代理
- java 设计模式 代理 静态和动态
- JAVA的代理模式(静态代理、JDK动态代理、cglib动态代理)
- java设计模式之静态代理与动态代理
- Java模式中的静态代理与动态代理
- 代理模式(静态代理+动态代理)——JAVA
- 【GOF23设计模式】_代理模式_静态代理_动态代理_开发场景JAVA236-237
- java的代理模式(静态和动态代理)
- Java设计模式学习06——静态代理与动态代理
- java的代理模式(动态代理和静态代理)
- java 代理模式(静态代理+动态代理)
- java 设计模式之四-代理模式 java静态代理和动态代理
- JAVA设计模式之代理模式(静态代理和动态代理)
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- java设计模式之四:代理模式 java静态代理和动态代理
- Java 设计模式——静态代理模式和动态代理模式
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- Java设计模式之 静态代理和动态代理
- Java设计模式——代理模式(静态代理vs动态代理)