Java设计模式之代理模式

代理模式:
我们先理解下面几个类,或许对你有所帮助。
1.InvocationHandler
在代理模式中我们需要实现该接口。该接口有一个方法invoke()方法,如下:

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;


参数理解:
proxy:需要被调用的代理对象
method:代理对象的方法。
args:代理对象方法的参数。

大家可能在想,为什么一个类中有参数,有构造方法,有get和set器,有类名,有实现接口,父类等等,这里只有三个参数?
其实代理模式调用的是接口,接口有方法,接口名,接口的属性,方法的参数,所以invoke方法的参数可以满足代理。

2.Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

废话不多说了 直接上代码分析。


package org.shen.proxy;

public interface Subject {
public String say(String name,int age);
}


Subject接口包含say方法,方法中有name和age属性。


package org.shen.proxy;

public class RealSubject implements Subject{

@Override
public String say(String name, int age) {
return name + " -- " + age;
}

}




package org.shen.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHandler{
private Object obj = null;

public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object temp = method.invoke(obj, args);
return temp;
}

}




package org.shen.proxy;

public class TestProxy {
public static void main(String[] args) {
//使用代理
MyInvocationHandler demo = new MyInvocationHandler();
Subject sv = (Subject)demo.bind(new RealSubject());


String info = sv.say("shenyc", 2);
System.out.println(info);

System.out.println("----------");

//不使用代理
//如果不使用代理,就会去实现接口Subject,即创建一个实现类
//使用代理的话直接到代理那儿去拿接口。
Subject s = new Subject() {

@Override
public String say(String name, int age) {
return name + " " +age ;
}
};

String infoa = s.say("shenyc", 21);
System.out.println(infoa);

//new一个实例

Subject ss = new RealSubject();

String infob = ss.say("shenyc", 22);

System.out.println(infob);
}
}




输出结果:

shenyc -- 2
----------
shenyc 21
shenyc -- 22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值