一、 Proxy模式定义:
为其他对象提供一种代理以控制这个对象的访问。
二、 模式解说
代理模式(Proxy)就是为其他对象提供一种代理以控制这个对象的访问,一个对象不想直接访问这个对象
具体Subject类:定义了RealSubject和Proxy的公用接口,这样就可以任何使用RealSubject的地方都可以用Proxy
RealSubject类:定义了Proxy所代表的真实实体。
Proxy类:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。
三、 结构图
Proxy模式结构图如下:
四、 一个请求的提交过程,每次在调用一个类的方法的时候,都先经过这个类的代理(Proxy),下面就是一个简单的例子来笔记一下:
package com.designpattern.proxy;
public interface Phone {
public void show();
}
package com.designpattern.proxy;
public class IPhone4S implements Phone {
private String owner;
public IPhone4S(String owner) {
this.owner = owner;
}
@Override
public void show() {
System.out.println("I'm " + owner
+ "'s IPhone4S which can do nothing while just a phone!");
}
}
package com.designpattern.proxy;
public class Proxy implements Phone {
private String owner;
private IPhone4S phone;
public Proxy(String owner) {
this.owner = owner;
}
@Override
public void show() {
if (phone == null) {
phone = new IPhone4S(owner);
}
phone.show();
}
}
package com.designpattern.proxy;
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy("halberd");
proxy.show();
}
}
五、 适用性
1) 假如有一个外部组件包,不允许实现其接口,则就只能使用其动态代理了。
2) 直接访问一个对象很困难,或者说不能访问,此时只能是找个代理去访问,然后把结果反馈给自己。
六、 优缺点
1) 优点: 向客户端隐藏了访问某个对象的细节及复杂性;可以动态地调用一个对象中的方法,且无需实现固定的接口。