系统架构设计——设计模式之代理模式(一)

时间:2021-03-06 21:58:22

在纷繁复杂的程序设计世界里,我们总是需要尽可能的考虑到各种情况。而有这么一种机制,我们可以将我们指责中的一部分隔离开来,让一个所谓的代理来帮我们解决一部分和主体业务关系不大的业务,从而让我们能更专心的设计我们的主体业务。这就是代理模式的初衷,也是很多流行框架的应用。——个人理解。

一、代理模式(Proxy)的定义

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二、应用场景


  1. 远程代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在不同地址空间的事实。例如:WebService、RPC、RMI(Remote Method Invocation)等。
  2. 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。例如:利用虚拟代理来优化页面的打开速度。
  3. 安全代理:用来控制真实对象访问时的权限。一般用户对象应该在不同访问权限的时候。
  4. 智能指引:是指当调用真实的对象时,代理处理另外一些事情。例如:Spring AOP、Hibernate等。

注:以上的代理并非只是简单的代理模式的应用,而是使用了下一篇介绍的动态代理的概念。但是思想其实都是一样的。

三、结构图

系统架构设计——设计模式之代理模式(一)

四、代码表示

4.1 抽象角色

通过接口或者抽象类声明真实角色实现的业务方法。

package com.xiaocao.proxy;

/**
* Subject类,定义了RealSubject和Proxy的公共接口
* 这样就在任何事哟娜RealSubject的地方都可以使用Proxy
*/

public abstract class Subject {
public abstract void Request();
}

4.2 代理角色

实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

package com.xiaocao.proxy;

/**
* Proxy类,保存一个引用使得使用代理可以访问实体,
* 并提供一个与Subject相同的接口,这样代理就可以用来替代实体
*/

public class Proxy extends Subject{

private RealSubject realSubject;

public void Request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.Request();
}
}

4.3 真实角色

实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

package com.xiaocao.proxy;
/**
* RealSubject类,定义了Proxy所代表的真实实体
*/

public class RealSubject extends Subject{
public void Request() {
System.out.println("真实的请求");
}
}

4.4 测试类

package com.xiaocao.proxy;

/**
* 测试类
*/

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

运行结果很简单:当调用代理的时候输出“真实的请求”。

五、代理模式的简单认识

  1. 代理模式思想上很简单,但是往往在应用上并不是那么简单。因为在实际开发中,往往我们在开发阶段并不知道抽象角色是谁,到时候我们需要根据客户的需求,动态的生成代理。这就是应用的关键了——动态代理
  2. 代理模式本身其实并没有多么高明之处,重要的是如何应用代理模式而实现的业务逻辑。就像简单的纸张本身其实并没有什么价值,而纸张上写的文字才是最重要的。我个人觉得应用最深刻的应该就是AOP面向切面编程的思想了吧。而在分布式中最常见的就是WebService和RPC了吧。似乎阿里的dubbo更是对RPC良好封装。

六、优缺点

优点

  1. 职责清晰
    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  2. 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
  3. .高扩展性

缺点

借用一句忠告,一个项目或者模块中最多不要超过5中设计模式,不然就是过度封装。这其实是所有开发者应该注意的东西。


注意:转载请标明,转自itboy-木小草
尊重原创,尊重技术。