首页 > 其他分享 >代理模式(Proxy Pattern)

代理模式(Proxy Pattern)

时间:2023-05-22 16:44:39浏览次数:32  
标签:level 对象 Pattern void 代理 Proxy Override public

一、模式动机

  • 通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作,或者将新的对象作为真实对象的一个替身
  • 引入代理对象来间接访问一个对象

二、模式定义

  • 给某一个对象提供一个代理,并由代理对象控制对原对象的引用
  • 对象结构型模式
  • 代理对象可以在客户端和目标对象之间起到中介的作用
  • 通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外的新服务

模式分类


  • 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)
  • 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建
  • 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限
  • 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
  • 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等

三、模式结构

image

  • Subject(抽象主题角色),声名接口,在需要使用真实主题时,都可以使用接口
  • Proxy(代理角色),包含对真实主题的引用
  • RealSubject(真实主题角色),包含真实的业务

四、案例实现

案例背景

在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有发帖、修改自己的注册信息、修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。使用代理模式来设计该权限管理模块。
在本实例中我们使用代理模式中的保护代理,该代理用于控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

案例结构

image

代码实现

抽象主题

public interface AbstractPermission {

    void modifyUserInfo();
    void viewnote();
    void publishnote();
    void modifynote();
    void setLevel(int level);

}

具体主题

public class RealPermission implements AbstractPermission{


    @Override
    public void modifyUserInfo() {
        System.out.println("修改用户信息");
    }

    @Override
    public void viewnote() {

    }

    @Override
    public void publishnote() {
        System.out.println("发布新帖");
    }

    @Override
    public void modifynote() {
        System.out.println("修改发帖内容");
    }

    @Override
    public void setLevel(int level) {

    }
}

代理

public class PermissionProxy implements AbstractPermission{

    private RealPermission realPermission = new RealPermission();
    private int level =0;

    @Override
    public void modifyUserInfo() {
        if (0 == level){
            System.out.println("对不起,您没有权限");
        } else if (1 == level) {
            realPermission.modifyUserInfo();
        }
    }

    @Override
    public void viewnote() {
        System.out.println("查看帖子");
    }

    @Override
    public void publishnote() {
        if (0 == level){
            System.out.println("对不起,您没有权限");
        } else if (1 == level) {
            realPermission.publishnote();
        }
    }

    @Override
    public void modifynote() {
        if (0 == level){
            System.out.println("对不起,您没有权限");
        } else if (1 == level) {
            realPermission.modifynote();
        }
    }

    @Override
    public void setLevel(int level) {
        this.level = level;
    }
}

客户测试

public class Client {

    public static void main(String[] args) {
        AbstractPermission permission = (AbstractPermission) XMLUtil.getBean();
        permission.modifynote();
        permission.viewnote();
        permission.publishnote();
        permission.modifynote();
        System.out.println("-----------------");
        permission.setLevel(1);
        permission.modifyUserInfo();
        permission.viewnote();
        permission.publishnote();
        permission.modifynote();
    }

}

案例结果

image

案例分析

在代理中定义realPermission对象,用于调用真实业务,并进行权限判断,实现对权限的控制,0为游客,1为已注册用户

五、模式分析

抽象主题

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

具体主题

public class RealSubject extends Subject{
    public void request() {
          //业务方法具体实现代码
    }
}

代理主题

public class Proxy extends Subject {
    private RealSubject realSubject = new RealSubject();     
                              //维持一个对真实主题对象的引用 
    public void preRequest() {  …...    } 
    public void request() {
        preRequest();
        realSubject.request();  //调用真实主题对象的方法
        postRequest();     
      } 
    public void postRequest() {     ……    }
}

六、总结

模式优点

  • 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
  • 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性

模式缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理)
  • 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)

使用情形

  • 当客户端对象需要访问远程主机中的对象时可以使用远程代理
  • 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理
  • 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理
  • 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理
  • 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理

标签:level,对象,Pattern,void,代理,Proxy,Override,public
From: https://www.cnblogs.com/sorrymine/p/17420839.html

相关文章

  • 外观模式(Facade Pattern)
    一、模式动机外观模式(FacadePattern)是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端和子系统之间的操作,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。外观模式中,外部与一个子系统的通信可以通过一个统一的外观......
  • AOP-基本概念以及底层原理(JDK动态代理实现)
    1.什么是AOP1.面向切面编程(面向方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率2.通俗描述:不通过修改源代码方式,在主干功能里添加新功能 AOP(底层原理) 1.AOP底层使用到了动态代理1.两......
  • PCR606-ASEMI代理长电原厂单向可控硅PCR606
    编辑:llPCR606-ASEMI代理长电原厂单向可控硅PCR606型号:PCR606品牌:长电\CJ封装:SOT-23正向电流:0.6A反向电压:600V引脚数量:3芯片个数:1芯片尺寸:漏电流:>10ua恢复时间:浪涌电流:30A芯片材质:正向电压:封装尺寸:如图特性:单向可控硅工作结温:-40℃~125℃PCR606的电性参数:正向电......
  • PCR406-ASEMI代理长电原厂单向可控硅PCR406
    编辑:llPCR406-ASEMI代理长电原厂单向可控硅PCR406型号:PCR406品牌:长电\CJ封装:SOT-23特性:可控硅正向电流:0.6A反向耐压:400V触发电压:0.62~0.8V引脚数量:3芯片个数:1芯片尺寸:浪涌电流:40A特点:单向可控硅工作温度:-40℃~125℃PCR406应用范围:万能开关器,继电器与灯控制,小型马......
  • 原型模式(Prototype Pattern)
    原型模式(PrototypePattern)一、意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二、优缺点优点:1、性能提高。2、逃避构造函数的约束。缺点:1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个......
  • requests: 基本使用、get、post、代理、cookie案例、超级鹰打码api
    1、requests_1_基本使用""".-''-..--._..._.'.-.)|__|......
  • 桥接模式(Bridge Pattern)
    模式动机桥接模式(BridgePattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的......
  • 如何挑选合适的海外HTTP代理?海外IP哪家强
    不整虚的,简单粗暴看这些海外HTTP代理服务商的官网就好了:以最基础的量去随便搜常见的那几家就行啦。大家熟知的bright data,得500美元一个月,相当于11.48美元/G,换成现在的汇率,得80.7元/G了。ipidea属于充值模式:1000元/月,动态数据中心IP的话,是15元/GB。netnut是100美元/月使用100GB,也......
  • Socks5代理:强大的网络安全工具
      在当今互联网时代,网络安全问题备受关注。恶意攻击、数据泄露和信息监控等威胁使得个人和企业面临严重风险。为了保护网络隐私和确保数据安全,IP代理技术成为了一种常见的解决方案之一。本文将重点介绍Socks5代理,探讨它在网络安全中的重要性以及如何使用和配置Socks5代理来提高......
  • cpp: Facade Pattern
     /*****************************************************************//***\fileGoldGraphic.h*\briefFacadePattern外观模式*涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateMay2023*************************************......