设计模式之代理模式(proxy pattern)
代理模式的本质是一个中间件,主要目的是解耦合服务提供者和使用者。使用者通过代理间接的访问服务提供者,便于后者的封装和控制。是一种结构性模式。
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:
目标对象的代理,负责控制和管理目标对象,并间接地传递外部对目标对象的访问。
- Remote Proxy: 对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者;
 - Virtual Proxy: 当目标对象的创建开销比较大的时候,可以使用延迟或者异步的方式创建目标对象;
 - 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)的更多相关文章
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
		
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
 - 二十四种设计模式:代理模式(Proxy Pattern)
		
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
 - c#设计模式之代理模式(Proxy Pattern)
		
引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...
 - 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】
		
介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...
 - 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
		
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
 - 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
		
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
 - 代理模式(Proxy pattern)
		
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
 - 设计模式——代理模式(Proxy Pattern)
		
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
 - 13.代理模式(Proxy Pattern)
		
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
 - 大熊君说说JS与设计模式之------代理模式Proxy
		
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
 
随机推荐
- Spring Cloud Alibaba Sentinel 的配置选项:spring.cloud.sentinel.transport.port,默认值:8719
			
spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互.比如 S ...
 - UiPath:Split(","c)以逗号区分遍历字符串数组
			
学习中遇到同一用户多种职业的情况,因为所有的数据都是从Excel里面取的,所以只能把所有的职业写在一个单元格里,以逗号区分. 那么就需要先把字符串转为数组,然后遍历数组去添加职位.如图 Split(& ...
 - python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程
			
GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...
 - 09-tensorflow-tf.split()
			
# 'value' is a tensor with shape [5, 30] # Split 'value' into 3 tensors with sizes [4, 15, 11] along ...
 - Socket-window通讯
			
#define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WINSOCK2.H> #include<STDIO.H> #include& ...
 - NOI2016优秀的拆分
			
一种想法是枚举分割位置, 然后考虑前面部分有多少种可行的AA拆分方式, 后面部分有多少种可行的BB拆分方式, 然后乘法原理即可 那么问题是如何快速求出合法方案 解法是首先枚举长度len, 然后将序列分 ...
 - 本地搭建WordPress (XAMPP环境)
			
1,XAMPP是一个流行的PHP开发环境,官网下载: https://www.apachefriends.org/zh_cn/index.html 然后安装. 官方介绍:XAMPP是最流行的PHP开发 ...
 - prometheus  consul  docker redis_exporter 自动注册配置
			
0.启动redis_exporter redis_exporter: version: '2'services: redis_exporter: image: oliver006/redis_expo ...
 - python运维开发常用模块(二)IPy
			
1.安装 IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直 接影响路由协议算法的效率,包括网络性能.可扩展性等方面,在这个 过程当中,免不了要计算大量的IP地址,包括网段.网络掩码.广播地 ...
 - PDMan-2.1.0 正式发布:用心开源,免费的国产数据库建模工具    PowerDesigner
			
PDMan是一款开源免费的数据库模型建模工具,支持Windows,Mac,Linux等操作系统,是PowerDesigner之外,更好的免费的替代方案.他具有颜值高,使用简单的特点.包含数据库建模,灵 ...