代理模式定义:是指为其他对象提供一种代理,以控制这个对象的访问。使用代理模式的主要目的有两个,其一是保护目标对象,其二是增强目标对象。
一、静态代理
比现在社会上火热的催婚问题,就可以用代理模式展示出来:
1、定义一个人类接口,内含一个寻找真爱的行为。
public interface Person{
public void findLove();
}
2、孩子要找对象,实现Person接口
public class Son implements Person{
@Voerride
public void findLove(){
System.out.println("寻找真爱");
}
}
3、父亲要帮孩子相亲,创建Father 类:
public class Father{
private Son son;
public Father(Son son){
this.son = son;
}
public void findLove(){
System.out.println("寻找相亲对象");
this.son.findLove();
System.out.println("相互看对眼了,并同意交往。");
}
}
4、测试
public static void main(String args[]){
// 只能帮自己的孩子物色对象
Father father = new Father(new Son);
father.findLove();
}
5、执行结果如下:
寻找相亲对象
寻找真爱
相互看对眼了,并同意交往。
以上就是父亲作为孩子找对象的代理,可以回顾并理解下代理模式。
二、动态代理
动态代理和静态代理思路一致,不过动态代理更为强大。由上面的例子可以看出,父亲这个代理只能为儿子寻找对象而不能为其他人寻找,如果想使用静态代理为其他人寻找对象的话,成本相对较高。这时候就需要婚介所登台以满足任何人的需求,动态代理就是这么实现的:
1、创建媒婆类,并实现 InvocationHandler 接口:
// 创建媒婆类 并实现InvocationHandler 接口
public class Meipo implements InvocationHandler{
// 被代理的对象,把引用保存下来
private Object target;
public Object getInstance(Object target) throws Exception{
this.target = target;
Class<?> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInstance(),this);
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {
before();
method.invoke(this.target,args);
after();
return proxy;
}
private void before(){
System.out.println("我是媒婆,根据你的需求,开始帮你物色对象。");
}
private void after(){
System.out.printn("合适就可以举行婚礼了。");
}
}
2、创建单身客户类:
public class Customer implements Person{
public void findLove(){
System.out.println("肤白貌美大长腿。");
}
}
3、测试如下:
public static void main(String[] args) {
Person obj = new Meipo().getInstance(new Customer());
obj.findLove();
}
4、执行结果如下:
我是媒婆,根据你的需求,开始帮你物色对象。
肤白貌美大长腿。
合适就可以举行婚礼了。
由此我们可以看出来,如果需要给另一个单身人士介绍对象的话,只需要在getInstance 方法中传入对应的单身人士的实例即可,而不限制于某一类客户。从而达到了动态代理的目的。