首先了解代理模式:
给某一个对象提供一个代理,并由代理对象控制对原对象的引用,是一种对象结构型模式。(比如某台远程服务器提供了一个功能很强大的加密算法,而现在正在开发的系统又需要使用到该算法,由于该算法位于远程服务器端,封装该算法的对象位于远程服务器的内存中,本地内存中的对象无法直接访问,因此需要通过一个远程代理的机制来实现对远程对象的操作)
subject(抽象主体角色)
声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。客户端需要针对抽象主题角色进行编程。
Proxy(代理主题角色):
内部包含着对真实主题的引用,从而可以在任何时候操作真实主题对象。代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实的主题对象,并对真实主题对象的使用加以约束。代理角色通常在客户端调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯的调用真实主题对象中的操作。
RealSubject(真实主题角色):
定义了代理角色所表示的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。
代理模式的核心:
代理模式在日常生活中随处可见:使用信用卡付款时,信用卡就是银行的代理。windows操作系统上的桌面快捷方法工具栏就是迅速打开应用程序的代理。
代理模式实例之论坛权限控制代理:
说明:
在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有发帖,修改自己的注册信息,修改自己的帖子等功能,而游客只能看到别人发的帖子,没有其他权限。(使用到保护代理,用于控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限)
实现:
抽象代理类AbstractPermission:
package 代理模式;
/**
* 论坛权限控制代理
* 抽象权限类AbstractPermission
* 真实主题角色RealPermission
* 代理主题角色PermissionProxy
* @author Administrator
*/
public interface AbstractPermission {
public void modifyUserinfo();
public void viewNote();
public void publishNote();
public void modifyNote();
public void setLevel(int level);
}
真实权限类RealPermission:
package 代理模式;
/**
* 真实权限类
* @author Administrator
*
*/
public class RealPermission implements AbstractPermission {
@Override
public void modifyUserinfo() {
System.out.println("修改用户信息");
}
@Override
public void viewNote() {
}
@Override
public void publishNote() {
System.out.println("发布新帖");
}
@Override
public void modifyNote() {
System.out.println("修改发帖内容");
}
@Override
public void setLevel(int level) {
}
}
权限代理类PermissionProxy:
package 代理模式;
/**
* 权限代理类
* @author Administrator
*
*/
public class PermissionProxy implements AbstractPermission{
private RealPermission permission = new RealPermission();
private int level = 0;
@Override
public void modifyUserinfo() {
if(0 == level){
System.out.println("没有该权限modifyUserinfo");
}else
if(1 == level){
// 调用真实权限类的方法
permission.modifyUserinfo();
}
}
@Override
public void viewNote() {
System.out.println("查看帖子");
}
@Override
public void publishNote() {
if(0 == level){
System.out.println("没有该权限publishNote");
}else
if(1 == level){
// 调用真实权限类的方法
permission.publishNote();
}
}
@Override
public void modifyNote() {
if(0 == level){
System.out.println("没有该权限modifyNote");
}else
if(1 == level){
// 调用真实权限类的方法
permission.modifyNote();
}
}
@Override
public void setLevel(int level) {
this.level = level;
}
}
客户端测试类:
package 代理模式;
import 工厂模式.XMLUtil;
public class Client {
public static void main(String[] args) {
AbstractPermission permission;
permission = (AbstractPermission)XMLUtil.getBean();
permission.modifyUserinfo();
permission.viewNote();
permission.publishNote();
permission.modifyNote();
System.out.println("___________________");
permission.setLevel(1);
permission.modifyUserinfo();
permission.viewNote();
permission.publishNote();
permission.modifyNote();
}
}
优缺点:
保护代理模式可以控制对真实对象的使用权限。
远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。远程代理为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。虚拟代理如果需要创建一个资源消耗较大的对象,西安创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。