您的位置:首页 > 其它

设计模式之代理模式(proxy pattern)

2019-05-31 23:39 1926 查看

代理模式的本质是一个中间件,主要目的是解耦合服务提供者和使用者。使用者通过代理间接的访问服务提供者,便于后者的封装和控制。是一种结构性模式。

1.目的

为外部调用者提供一个访问服务提供者的代理对象。

2.动机

限制对目标对象的直接访问,降低耦合度。

3.优缺点

优点:

优点: 

  • 低耦合
  • 易扩展
  • 灵活度高

缺点:

  • 间接访问可能会延迟请求相应
  • 增加工作量

4.分类

  • 静态代理
  • 动态代理

  代理类本身的实现可能并不简单,加上每一个需要代理的对象均均需要实现一个代理类,其工作量本身比较大,易出错。

  所谓动态代理(DynamicProxy)是指在程序运行时动态的生成对目标对象的访问接口。

  本文主要介绍前者,关于后者可以参考JDK自带的动态代理。

5.主要用途

代理模式在以下场景比较适用:

     1、远程代理。 2、虚代理。 3、保护代理。4、智能指引代理。5、写时复制(Copy-on-Write)代理。  6、缓存代理。 7、防火墙代理。 8、同步化代理。

6.原理

下面是GoF介绍典型的代理模式UML类图

public class SmartPointer implements Obj{

private RealObj realObj;
private int counter = 1;

public SmartPointer(String objType){
this.realObj = new RealObj(objType);
}

@Override
public void GetAttr() {
if(counter > 0) {
realObj.GetAttr();
}
System.out.println("Smart Ref: " + counter);
}

public Obj copy() {
if(counter > 0) {
counter += 1;
return this;
}
System.out.println("Invalid Pointer!");
return null;
}

public void delete() {
if(counter > 0) {
counter -= 1;
if(0 == counter) {
realObj = null;
}
}
else {
System.out.println("Invalid Pointer!");
}
}
}
View Code  被引用对象类RealObj:

public class RealObj implements Obj {
private String objType;
public RealObj(String objType) {
this.objType = objType;
System.out.println("Create Obj: " + objType);
}

@Override
public void GetAttr() {
System.out.println("get attr of real obj " + objType);
}

@Override
public Obj copy() {
// TODO Auto-generated method stub
return null;
}

@Override
public void delete() {
// TODO Auto-generated method stub

}
}
View Code

 参考:

GoF《Design Patterns: Elements of Reusable Object-Oriented Software》

https://www.runoob.com/design-pattern/proxy-pattern.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: