结构型模式7.代理模式

结构型模式

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 组合模式(Composite Pattern)
  4. 装饰器模式(Decorator Pattern)
  5. 外观模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

定义:代理模式是一种结构型设计模式,它提供了一个代理对象来控制对另一个对象的访问。通过代理对象,客户可以间接访问目标对象。代理对象通常用来在访问目标对象时提供附加功能,比如延迟加载、访问控制、日志记录等。

代理模式主要有以下三种类型:

  1. 虚拟代理:延迟对象的创建,只有在需要时才创建目标对象。
  2. 远程代理:表示一个对象在不同的地址空间(通常是远程机器)上的代理。
  3. 保护代理:控制访问权限,对目标对象进行访问控制。

代理模式的主要角色

  • Subject:定义了代理和真实主题(RealSubject)所共享的接口。客户端通过这个接口与真实对象或代理对象进行交互。
  • RealSubject :实现了 Subject 接口,表示真实的业务对象。
  • Proxy :实现了 Subject 接口,并持有一个真实的 RealSubject 对象,负责控制对 RealSubject 的访问。

代理模式的应用场景

  1. 延迟加载:只有在需要时才加载某些资源。
  2. 访问控制:在某些情况下控制对对象的访问,避免直接暴露给客户端。
  3. 日志记录:在代理对象中添加日志记录功能,记录对目标对象的操作。
  • RealShoppingCart 类表示真实的购物车,实际进行结账操作。现在输出的文本已经改为中文:"结账:正在处理支付和配送。"

  • ShoppingCartProxy 类添加了额外的检查功能,并在每个检查环节输出中文提示:"代理:用户未登录,请先登录后继续。"、"代理:余额不足,请充值后继续。" 和 "代理:所有检查通过,正在进行结账。"

  • Client 类模拟了不同的用户场景,分别输出不同的中文提示信息。

    public interface ShoppingCart {
    void checkout(); // 用户结账购买商品
    }

    public class RealShoppingCart implements ShoppingCart {
    @Override
    public void checkout() {
    System.out.println("结账:正在处理支付和配送。");
    }
    }

    public class ShoppingCartProxy implements ShoppingCart {
    private RealShoppingCart realShoppingCart;
    private boolean isLoggedIn; // 模拟用户登录状态
    private double userBalance; // 模拟用户余额

    复制代码
      public ShoppingCartProxy(boolean isLoggedIn, double userBalance) {
          this.isLoggedIn = isLoggedIn;
          this.userBalance = userBalance;
      }
    
      @Override
      public void checkout() {
          // 代理前的附加功能
          if (!isLoggedIn) {
              System.out.println("代理:用户未登录,请先登录后继续。");
              return;
          }
    
          double totalAmount = 100.0;  // 假设购物车的总金额是100
    
          if (userBalance < totalAmount) {
              System.out.println("代理:余额不足,请充值后继续。");
              return;
          }
    
          // 如果没有问题,就调用真实对象的方法
          if (realShoppingCart == null) {
              realShoppingCart = new RealShoppingCart();  // 延迟加载真实购物车
          }
    
          System.out.println("代理:所有检查通过,正在进行结账。");
          realShoppingCart.checkout();  // 真实对象进行结账操作
      }

    }

    public class Client {
    public static void main(String[] args) {
    // 假设用户没有登录,余额足够
    ShoppingCart cart1 = new ShoppingCartProxy(false, 200.0);
    cart1.checkout(); // 输出:代理:用户未登录,请先登录后继续。

    复制代码
          // 假设用户已登录,余额不足
          ShoppingCart cart2 = new ShoppingCartProxy(true, 50.0);
          cart2.checkout();  // 输出:代理:余额不足,请充值后继续。
    
          // 假设用户已登录,余额足够
          ShoppingCart cart3 = new ShoppingCartProxy(true, 200.0);
          cart3.checkout();  // 输出:代理:所有检查通过,正在进行结账。 结账:正在处理支付和配送。
      }

    }

相关推荐
panzer_maus10 小时前
工厂模式、代理模式与单例模式的介绍
java·设计模式·代理模式
花月C1 天前
线性动态规划(Linear DP)
算法·动态规划·代理模式
散峰而望1 天前
【基础算法】动态规划从入门到进阶:记忆化搜索、线性 DP、LIS/LCS 一网打尽
c++·后端·算法·github·深度优先·动态规划·代理模式
淡忘旧梦1 天前
ChatGPT回答白屏
人工智能·chatgpt·代理模式
会编程的土豆2 天前
【数据结构与算法】动态规划
数据结构·c++·算法·leetcode·代理模式
范纹杉想快点毕业3 天前
C语言编程实战宝典:550例精解·涵盖基础语法·数组指针·位运算·递归·贪心·动态规划
c语言·动态规划·代理模式
想不明白的过度思考者3 天前
SpringAOP:Java 三大代理模式:从静态代理到 JDK & CGLIB 动态代理
java·开发语言·代理模式
※DX3906※5 天前
SpringBoot之旅5| 快速上手SpringAOP、深入刨析动态/静态两种代理模式
java·数据库·spring boot·后端·spring·java-ee·代理模式
无籽西瓜a5 天前
【西瓜带你学设计模式 | 第九期 - 代理模式】代理模式 —— 静态与动态代理实现、优缺点与适用场景
java·后端·设计模式·软件工程·代理模式
江畔何人初8 天前
iptables 和 IPVS 代理模式 Service 的区别
linux·运维·服务器·网络·云原生·kubernetes·代理模式