近期着实的想回顾一下自己已经忘得差不多的设计模式
先从代理模式开始吧
- 代理模式:简单的讲代理就是中介,中间人。法律上也有代理,比如代理律师之类,委托人将自己的一部分权限委托给代理者,代理者就拥有被代理者(委托人)的部分权限,并且可以以被代理人的名义来实行这些权限,此时代理者与委托人等同,当然代理人也可以在实行权限时配合自己的能力来进行,当然不能超出这个权限。
Java中的代理模式类似于上面的代理,我们也是为一个类(委托类)创建一个代理类,来代表它来对外提供功能。
如何在Java中创建一个类的代理类呢?
很简单,我们需要创建一个公共接口,委托类要实现这个接口,再创建一个接口的实现类作为代理类,在这个类中的方法中可以直接调用委托类中的同名方法,外部类要进行访问时,可以使用接口指向代理类实例,调用代理类中的方法,从而间接调用委托类中的具体方法实现。 - 我们就以法律上的委托代理为例来写个实例:
/* 定义人这个接口*/
public interface Person{
public void doSomething();
}
然后我们再来生成委托人类
/*委托人*/
public class Wtr implements Person{
@Override
public void doSomething(){
System.out.print("我再让我律师给你交谈");
}
}
最后我们来让律师执行
/*律师类*/
public class Ls implement Person{
private Person p;
public Ls(Person p){
this.p = p;
}
@Override
public void doSomething(){
p.doSomething();
}
}
- 当然代理还分为动态代理以及静态代理
静态代理:
以上面代码为例:
输出的结构为:public staitc void main(String [] args){ //s为被代理的对象,某些情况下 我们不希望修改已有的代码,我们采用代理来间接访问 Wtr s = new Wtr (); //创建代理类对象 Ls proxy = new Ls(s); //调用代理类对象的方法 proxy.doSomething(); }
我再让我律师给你交谈
静态代理看起来是比较简单的,没有什么问题只不过是在代理类中引入了被代理类的对象而已。
动态代理:若是动态代理,他可以代理多个不通的委托类
/**
* 动态代理,动态代理类不要显示的实现被代理类所实现的接口
* @author yujie.wang
*
*/
public class MyInvocationHandler implements InvocationHandler{
private Object object;
public MyInvocationHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("我插一句,我开始叙述了:");
method.invoke(object, args);
System.out.println("我叙述完毕!");
return null;
}
}
代理类:
public class PersonProxy {
private Object target;
private InvocationHandler ph;
public PersonProxy(Object target,InvocationHandler ph){
this.target = target;
this.ph = ph;
}
public Object getPersonProxy(){
Object p = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),ph);
return p;
}
}
测试类:
/**
* 测试类
*/
public class App {
public static void main(String[] args) {
// 目标对象
Wtr target = new Wtr ();
InvocationHandler inv = new MyInvocationHandler(target);
// 给目标对象,创建代理对象
Person proxy = (Person) new PersonProxy(target,inv).getPersonProxy();
// class $Proxy0 内存中动态生成的代理对象
// 执行方法 【代理对象】
proxy.doSomething();
}
}
输出结果为:
我插一句,我开始叙述了:
我再让我律师给你交谈
我叙述完毕!
ps:我们所熟悉的springAop切面也是通过动态代理所实现的。