在某些情况下,一个客户不想或是不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用,代理可以在客户端和目标对象之间起中介作用,并且通过代理对象去掉客户不能看到的内容和服务或是添加客户需要的额外服务。
代理模式组成:抽象主题角色,代理主题角色,真实主题角色。
//抽象主题角色
public interface AbstractPermission {
public void modifyUserInfo();
public void viewNote();
public void publishNote();
public void modifyNote();
public void setLevel(int level);
}
//代理主题角色
public class PermissionProxy implements AbstractPermission {
private RealPermission permission = new RealPermission();
private int level = 0;
@Override
public void modifyUserInfo() {
// TODO Auto-generated method stub
if(level == 0){
System.out.println("对不起,你没有权限");
}
else if(level == 1){
permission.modifyNote();
}
}
@Override
public void viewNote() {
// TODO Auto-generated method stub
System.out.println("查看帖子");
}
@Override
public void publishNote() {
// TODO Auto-generated method stub
if(level == 0){
System.out.println("对不起,你没有权限!");
}
else if(level == 1){
permission.publishNote();
}
}
@Override
public void modifyNote() {
// TODO Auto-generated method stub
if(level == 0){
System.out.println("对不起,你没有权限!");
}
else if(level == 1){
permission.modifyNote();
}
}
@Override
public void setLevel(int level) {
// TODO Auto-generated method stub
this.level = level;
}
}
//真实主题类
public class RealPermission implements AbstractPermission {
@Override
public void modifyUserInfo() {
// TODO Auto-generated method stub
System.out.println("修改用户信息!");
}
@Override
public void viewNote() {
// TODO Auto-generated method stub
}
@Override
public void publishNote() {
// TODO Auto-generated method stub
System.out.println("发布新帖");
}
@Override
public void modifyNote() {
// TODO Auto-generated method stub
System.out.println("修改发帖内容!");
}
@Override
public void setLevel(int level) {
// TODO Auto-generated method stub
}
}
代理模式优点:
(1)能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
(2)远程代理使得客户端可以访问远程机器上的对象,远程机器可能具有更好的计算性能并提高运行速度。
(3)保护代理模式可以控制对真实对象的使用权限。
代理模式缺点:
(1)由于增加了代理对象,因此有些类型的代理模式可能造成请求处理速度过慢
常见的代理模式种类:
(1)远程代理:为处于不同地址空间的对象提供一个本地的代理对象。
(2)虚拟代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要时才被创建。(Copy-on-Write代理)
(3)保护代理:控制对象的访问,可以给不同的用户提供不同级别的使用权限。
(4)缓冲代理
(5)防火墙代理
(6)同步化代理
(7)智能化代理
最终是要通过反射实现动态代理,因为随着类的增加,代理类的数目也会增加,所以引入动态代理
//抽象主题角色
public interface UserManager {
public void addUser(String userId,String userName);
public void modifyUser(String userId,String userName);
public void delUser(String userId);
public String findUser(String userId);
}
//真实主题角色
public class UserManagerImpl implements UserManager {
public void addUser(String userId, String userName) {
System.out.println("正在添加用户,用户为:"+userId+userName+"……");
}
public void delUser(String userId) {
System.out.println("delUser,userId="+userId);
}
public String findUser(String userId) {
System.out.println("findUser,userId="+userId);
return userId;
}
public void modifyUser(String userId, String userName) {
System.out.println("modifyUser,userId="+userId);
}
}
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
private Object targetObject;
public Object newProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object ret = null;
try {
System.out.println("正在进行操作前的准备工作……");
ret = method.invoke(targetObject, args);
System.out.println("操作成功,正在进行确认处理……");
} catch (Exception e) {
e.printStackTrace();
System.out.println("error-->>" + method.getName());
throw e;
}
return ret;
}
}
关于动态代理模式未完待续——————————————————————-(目前不太清楚)