lusiqi

设计模式-代理模式,介绍代理模式,及代码实现。


简介

代理模式,为其他对象提供一种代理以控制这个对象的访问。

应用场景

  • 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,这样可以达到性能最优化,比如在打开一个很大的HTML网页时,此时看到的是所有文字,图片确是一张张虚拟的图片框,需要点击才会加载。
  • 安全代理:用来控制真实对象访问时的权限。
  • 智能指引:当调用真实对象时,代理处理另外的事情,如计算真实对象引用的此时,当没有引用时释放它,或当第一次引用一个持久对象时,将它装入内存,或在访问一个对象时检查是否上锁;他们都是通过代理在访问一个对象时附加处理一些别的事情。

角色

  • 公用接口:定义真实实体类与代理类共用的接口
  • 真实的实体类,被代理的对象
  • 代理类

代码实现

公用接口

1
2
3
4
5
6
7
8
9
10
/**
* @description 定义真实实体类与代理类共用的接口
* @author dxy
* @date 20200312
*
*/
public interface Subject {

public void request();
}

真实实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @description 真实实体类
* @author dxy
* @date 20200312
*/
public class RealSubject implements Subject {

@Override
public void request() {
System.out.println("真实对象的请求");
}

}

代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @description 代理类
* @author dxy
* @date 20200312
*/
public class Proxy implements Subject {

// 保存一个引用,使得代理可以访问真实实体
Subject subject;

public Proxy() {
subject = new RealSubject();
}

@Override
public void request() {
subject.request();
}

}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @description 代理客户端
* @author dxy
* @date 20200312
*/
public class ProxyClient {

public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}

 评论