代理模式
认识
代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
客户端操作代理对象时,具体的操作还是由被代理对象实现,客户端操作代理,代理操作被代理,被代理对象对于客户端是透明的。
代理模式同装饰模式不同在,Decorator模式是要对原对象的功能进行增强,而Proxy模式一般只是对原对象的使用进行控制,并不会增加原对象的任何功能。
思考
保护代理:可以在代理中对客户端的访问添加一些权限控制。
代理模式的本质:控制对象访问
静态代理VS动态代理
AOP
使用场景
- 需要控制对原始对象的访问的时候,可以使用代理模式
- 需要对原始对象的访问前后添加新的逻辑时,可以使用代理模式
优缺点
优点
- 能够在方法的执行前和执行后添加新的逻辑
- 能够控制对象的访问权限
缺点
- 静态代理中如果接口发生变化,会导致代理对象的实现也改变,动态代理可以避免这个问题。
UML图
代理对象和被代理对象实现同一接口,代理对象持有一个被代理对象,对于要代理的方法,进行处理,对于不代理的方法,调用被代理对象
- 抽象对象角色(AbstractObject):声明被代理对象和代理对象的共同接口,在任意可以使用被代理对象的地方都可以使用代理对象
- 被代理对象(RealObject):
- 代理对象(ProxyObject):
- 跟被代理对象实现共同的接口,可以使用代理对象替换被代理对象
- 持有一个被代理对象,可以调用被代理对象
- 有选择的对被代理对象的方法进行代理或者不代理
代码实现
类似装饰模式,但是代理模式中被代理对象一般不需要客户端传入,被代理的对象对于客户端是透明的
//抽象对象
public abstract class AbstractObject {
//操作
public abstract void operation();
}
//被代理对象
public class RealObject extends AbstractObject {
@Override
public void operation() {
//一些操作
System.out.println("一些操作");
}
}
//代理对象
public class ProxyObject extends AbstractObject{
//持有一个被代理对象
RealObject realObject = new RealObject();
//代理被代理对象中的方法
@Override
public void operation() {
//调用目标对象之前可以做相关操作
System.out.println("before");
realObject.operation();
//调用目标对象之后可以做相关操作
System.out.println("after");
}
}
//客户端调用
public class Client {
public static void main(String[] args) {
//客户端使用代理对象
AbstractObject obj = new ProxyObject();
obj.operation();
}
}