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

1.目的

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

2.动机

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

3.优缺点

优点:

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

缺点:

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

4.分类

  • 静态代理
  • 动态代理

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

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

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

5.主要用途

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

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

6.原理

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

Subject:

 定义RealSubject对外的接口,且这些接口必须被Proxy实现,这样外部调用proxy的接口最终都被转化为对realsubject的调用。

RealSubject:

 真正的目标对象。

Proxy:

 目标对象的代理,负责控制和管理目标对象,并间接地传递外部对目标对象的访问。

  1. Remote Proxy: 对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者;
  2. Virtual Proxy: 当目标对象的创建开销比较大的时候,可以使用延迟或者异步的方式创建目标对象;
  3. Protection Proxy: 细化对目标对象访问权限的控制;

7.实现

下面我们使用两个例子来实际体验一下代理模式的应用

网络代理

对于一些国内不能直接访问的网站,合法的使用的网络代理可以实现对目标网站的访问;

定义公共接口类Server:

public interface Server{
void visit(String url);
}

代理服务器ProxyServer:

public class ProxyServer implements Server{

   private RealServer realServer;

   public ProxyServer(String serverName){
this.realServer = new RealServer(serverName);
} @Override
public void visit(String url) {
realServer.visit(url);
}
}

目标服务器RealServer:

public class RealServer implements Server {
private String serverName;
public RealServer(String serverName) {
this.serverName = serverName;
System.out.println("This is " + serverName);
} @Override
public void visit(String url) {
response(url);
} private void response(String res) {
System.out.println("This is response of " + res + " from server:" + serverName);
}
}

演示:

public class Demo {
public static void main(String[] args) {
Server server = new ProxyServer("www.google.com");
server.visit("map.google.com");
}
}

智能指针引用计数

下面使用代理模式简单的模拟指针引用计数问题

接口类Obj:

public interface Obj{
void GetAttr();
Obj copy();
void delete();
}

智能指针类SmartPointer:

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!");
}
}
}

被引用对象类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 }
}

参考:

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

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

设计模式之代理模式(proxy pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  2. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  3. c#设计模式之代理模式(Proxy Pattern)

    引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...

  4. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】

    介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...

  5. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

  7. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

  8. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  9. 13.代理模式(Proxy Pattern)

    using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...

  10. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

随机推荐

  1. JVM 启动参数,共分为3类

    JVM 启动参数,共分为3类: 类别 说明 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 非标准参数(-X) 这些参数不是虚拟机规范规定的.因此,不是所有VM的实现(如:H ...

  2. 通过SimpleHTTPServer实现树莓派与主机传输文件

    默认情况我们的Raspberry Pi已经安装了python 2.7版本.python2 中默认包含了SimpleHTTPServer这个库.因此我们可以直接拿来使用. 从名字中我们就可以看出来,他是 ...

  3. html--前端jquery初识

    一.把 jQuery 添加到您的网页如需使用 jQuery,需要下载 jQuery 库,然后把它包含在希望使用的网页中.jQuery 库是一个 JavaScript 文件,您可以使用 HTML 的 & ...

  4. Debian 9 部分快捷键失效问题

    教程 具体修复过程: 安装gnome-screensaver包,重启恢复正常.

  5. Linux性能优化实战学习笔记:第十八讲

    一.内存的分配和回收 1.管理内存的过程中,也很容易发生各种各样的“事故”, 对应用程序来说,动态内存的分配和回收,是既核心又复杂的一的一个逻辑功能模块.管理内存的过程中,也很容易发生各种各样的“事故 ...

  6. [LeetCode] 891. Sum of Subsequence Widths 子序列宽度之和

    Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the  ...

  7. [LeetCode] 253. Meeting Rooms II 会议室之二

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  8. Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法

    一.$\tt Toeplitz$矩阵与循环($\tt Circulant$)矩阵 定义 为$n\times n$阶循环矩阵. 定义 $T_n(i,j)=t_{j-i} $  为$n\times n$ ...

  9. MySQL基础指令和安装

    数据库概念 那Mysql能干嘛呢?它就是一款软件,安装在任何一台计算机或者服务器上的时候,只要我告诉它创建一个文件,新增一个数据,删除一个数据它就能帮我去做想要的操作 那我们暂且能不能理解为mysql ...

  10. python 根据文件的编码格式读取文件

    因为各种文件的不同格式,导致导致文件打开失败,这时,我们可以先判断文件的编码吗格式,然后再根据文件的编码格式进行读取文件 举例:有一个data.txt文件,我们不知道它的编码格式,现在我们需要读取文件 ...