本章是对设计模式之禅一书中代理模式一章的总结与整理。
1.定义
为其它对象提供一种代理以控制对这个对象的访问。不好理解,设计模式的每种类型的定义第一遍都不太好读懂的,这句话翻译成大白话就是:你要想访问我,对不起,找我代理吧。用另外的话说就是:你要访问一个对象,对不起,通过它的代理去访问它吧,人家不想和你直接打交道。最简单的实例就是:你要去拜访一个明星,是不是得先去找人家的经纪人呢。代理就是这么个意思,这是根本,这个是宗旨。通用类图如下:

2.扩展与类型
第一类:普通代理
书中将普通代理分为了两个大类,一个是透明代理,一个是普通代理。
-
透明代理:就是用户不用设置代理,可以直接访问真实的(比如代理服务器)
-
普通代理:要求是客户只能访问代理角色,而不能访问真实的角色,这个是最好理解的。一个真实的示例就是:懒人买余额宝,由余额宝去买基金,余额宝就是代理角色,而你实际买的应该是一些基金,只不过是通过余额宝购买的。
第二类:强制代理
这个比较变态,你根本不知道代理是谁,只知道真实角色是谁,你必须通过真实的对象获取它的代理类,然后通过代理类去访问真实角色,如果不是真实角色给你的代理你也无法访问,挺变态的。
示例是这样的:你的一个朋友现在是一名很牛X的歌手,你要去访问他,然后给他打电话问他什么时候有空,然后他告诉你“这样吧,你找我代理吧,让他告诉你”,你说变态不变态。
第三类:虚拟代理
它的意思就是说:在需要的时候才初始化主题对象。我不太明白它的具体用途是什么?
第四类:动态代理
动态代理是在实现阶段(就是编码阶段)不用关心代理是谁,而在运行阶段才指定代理哪一个对象,反过来说,自己写代理类的方式就是静态代理。
我们来举一个示例,在帝都很多人都有过找房子的经历,以此为例。首先得有人,定义一个接口租房子,它有两个方法:找房子,签合同。
public interface IRent {
public void searchHouse();
public void contractHouse();
}
实现这个方法,其代码如下:
public class Renter implements IRent {
String name="";
public Renter(String _name){
this.name=_name;
}
@Override
public void searchHouse() {
System.out.println(this.name+"正在找房子");
}
@Override
public void contractHouse() {
System.out.println(this.name+"正在签合同");
}
}
接下来实现代理类,其代码如下:
public class RentProxy implements InvocationHandler {
//被代理的对象
Object target=null;
public RentProxy(Object _object){
this.target=_object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行被代理的方法
//在执行这个被代理的方法前后可以执行你想执行的操作,比如打印日志,判断Session等
return method.invoke(this.target,args);
}
}
动态代理请务必实现InvocationHandler接口,这个接口只有一个方法,在这个方法中调用被代理类的实际方法。这一点很不好理解,可以在此先记住这个,以后慢慢理解。
再看场景类的具体实现:
public class Client {
public static void main(String[] strings){
//定义房客
IRent iRent=new Renter("张三");
//定义handler
InvocationHandler invocationHandler=new RentProxy(iRent);
//动态产生一个代理
IRent proxy= (IRent)Proxy.newProxyInstance(iRent.getClass().getClassLoader(),new Class[]{IRent.class},invocationHandler);
proxy.searchHouse();
proxy.contractHouse();
}
}
场景类分四步走:
-
定义房客
-
定义Handler
-
使用jdk 提供的Proxy类动态产生一个代理类
-
通过产生的动态代理类,去执行相应的方法
对比以上的场景类,基本就是按照这个思路来的。
以上这些就是代理模式的相关内容。
网友评论