您的位置:首页 > 编程语言 > Java开发

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开始跳舞吃饭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: