代理模式,字面上很容易理解,别人帮你去做,实际上意义也差不多。
假设有这样一个情景:
有三位同学,分别是,
小A,性别男,爱好女;
小B,性别女,爱好学习;
小C,性别男,爱好小B;
小A和小C是很要好的朋友,小A也知道小C喜欢小B。但是小C是个内向的男孩,因而经常性的要小A出面做一些事,
比如给小B送情书,巧克力之类的。日复一日年复一年,结果猜得到,小A和小B在一起了哈哈哈。。。
这个示例中,就体现出了代理模式的精髓,小C的一切追求行为都是由小A代理的!
那一般代理模式都用在什么场合呢?
1、远程代理,也就是为一个对象在不同的地址空间提供局部代理,这样就可以隐藏一个对象存在于不同地址空间的事实。
2、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真是对象。
3、安全代理,用来控制真实对象访问时的权限。
4、只能指引,是指当调用真实的对象是,代理处理另外一些事。
先看看类图理解下代码框架:
上图中包含四个类,其中User仅仅有一个main方法用于测试,Subject类是统一的行为抽象类,
RealSubject是真实的操作类,而Proxy则是代理类。
接下来看源码:
Subject类:
package com.blog.anla.Proxy;
/**
* subject类,定义了realsubject和proxy的共用接口,
* 这样就能在任何使用realsubject的地方都可以使用proxy
* @author U-ANLA
*
*/
public abstract class Subject {
public abstract void request();
}
RealSubject类:
package com.blog.anla.Proxy;
/**
* 定义proxy所代表的真实实体
* @author U-ANLA
*
*/
public class RealSubject extends Subject{
@Override
public void request() {
System.out.println("真实的请求!");
}
}
Proxy类:
package com.blog.anla.Proxy;
/**
* 代理类,封装和隐藏真实物体的行为,
* 这里主要是隐藏realsubjec类的行为。
* 同样继承自subject,可以理解成代理,所以要有同样的
* 动作嘛。
* @author U-ANLA
*
*/
public class Proxy extends Subject{
private RealSubject realSubject;
@Override
public void request() {
synchronized(this) {
if(realSubject == null){
realSubject = new RealSubject();
}
}
realSubject.request();
}
}
测试类User:
package com.blog.anla.Proxy;
/**
* 使用者,主要是测试proxy模式。
* @author U-ANLA
*
*/
public class User {
public static void main(String[] args) {
Proxy p = new Proxy();
p.request();
}
}