介绍
* 为其他对象提供一种代理以控制对这个对象的访问
* 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
代理模式的应用
远程代理:屏蔽对象存在于不同空间的事实;如webservice是一门跨平台的技术,假设使用.net写的服务比java使用,那么就会生成一个java端的代理来供java代码使用
虚拟代理:存放创建资源开销大的对象;如Hibernate中的load方法的懒加载
安全代理:通过代理对象代理真是对象,从而控制真是对象的权限
智能指引:当调用真实对象时,代理处理另外一些事情;如第一次引用持久化对象,会将其存到内存中
参考自书籍《大话设计模式》
入门案例:
代码:
Home:
public interface Home {
void get(String packageName);
}
XiaoMing:
public class XiaoMing implements Home {
@Override
public void get(String packageName) {
System.out.println("接收:" + packageName);
}
}
MaMa:
public class MaMa implements Home {
private XiaoMing xiaoming;
{
this.xiaoming = new XiaoMing();
}
@Override
public void get(String packageName) {
System.out.println("妈妈代理小明接收包裹");
xiaoming.get(packageName);
System.out.println("妈妈代理小明接收完包裹了");
}
}
测试:
public class Main {
public static void main(String[] args){
/**
* 模拟场景:
* 小明在网上买了个女朋友,当天送到,但同时小明今天又约了朋友小强去网吧玩地下城
* 因为妈妈也是这个家的成员,所以傻乎乎的快递员就同意让妈妈签收了
* 这时,妈妈就充当代理(proxy)这个角色,来去代替小明接收这个网购的女朋友,然后交给小明
*/
String packageName = "女朋友";
MaMa maMa = new MaMa();
maMa.get(packageName);
/**
* output:
* 妈妈代理小明接收包裹
* 接收:女朋友
* 妈妈代理小明接收完包裹了
*/
}
}