java设计模式
Proxy
: 代理人——代替别人工作的人
“本人”寻找“代理人”工作,但是代理人毕竟是代理人,能代替本人所做的事有限,当代理人无法帮忙时再寻找本人
RealSubject:真实角色,是实现抽象接口的类。
Proxy:代理角色,内部含有对真实对象RealSubject的引用
,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
Subject : 接口,是对象和它的代理共用
的接口,让RealSubject和Proxy具有一致性。
1.抽象接口
public interface Subject {
void setNumber(int number);//代理人可以帮忙做的事
int getNumber();//代理人可以帮忙做的事
void displayNumber();//只有本人才能做的事
}
2.真实类
public class RealSubject implements Subject {
private int number;
public RealSubject(){
System.out.println("正在生成本人实例");
}//非参构造函数
public RealSubject(int number){
this.number = number;
System.out.println("正在生成本人实例");
}//构造函数
@Override
public void setNumber(int number) {
this.number = number;
}
@Override
public int getNumber() {
return number;
}
@Override
public void displayNumber() {
System.out.println("只有本人才能做的事 :");
System.out.println(number);
}//只有本人才能做的事
}
3.代理类
public class Proxy implements Subject {
private RealSubject realSubject;//本人。代理人持有本人的引用,当代理人无法完成要求时,再生成本人
private int number;
public Proxy(int number){
this.number = number;
}
@Override
public void setNumber(int number) {
if(realSubject != null){
//当本人不是null,则说明以及生成了本人的实例化对象,这时就可以直接让本人操作了
realSubject.setNumber(number);
}
this.number = number;
}
@Override
public int getNumber() {
return number;
}
@Override
public void displayNumber() {
//这件事只用又本人来做,所以要生成“本人”
realize();
realSubject.displayNumber();
}
private void realize(){
if(realSubject == null){
realSubject = new RealSubject();
}
}
}
4.测试
public class Main {
public static void main(String[] args) {
Subject subject = new Proxy(5);
System.out.println("现在的数字是 :" + subject.getNumber());//获得数字代理即可完成
subject.setNumber(12);//设置数字,代理也可以完成
System.out.println("设置后的数字是 :" + subject.getNumber());//获得数字代理即可完成
System.out.println("打印出数字(只能由本人完成)");
subject.displayNumber();
}
}
5.运行结果
优点
使用Proxy角色,使得耗时处理(生成实例)推迟。
在大型系统的初始化过程中,存在大量耗时处理,如果初始化暂时不会使用的功能,会使启动时间延长,所以使用代理模式,先初始化需要使用的功能
代理与委托
当遇到代理人不会解决的问题时,还是会“转交”给本人——“委托”(现实世界中是本人委托给代理人,在设计模式中却相反)
HTTP代理
Web浏览器访问Web页面,不会每次都访问远程Web服务器来获取页面内容,而是先获取HTTP代理缓存的页面。只有当需要新的页面或者是页面缓存过期才去访问远程Web服务器
Web服务器:Client角色,HTTP代理:Proxy角色,Web服务器:RealSubject角色