当前位置: 首页 > news >正文

设计模式之代理模式!

大家好,欢迎来到程序视点!上一篇文章我们讲了适配器模式(Simple Factory)适配器模式有三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

它们的区别就是:以何种方式把要适配的资源给到适配器

它们分别是:以类的方式继承,以对象的方式持有和以接口(抽象)的方式实现。

我们说过:适配器模式的特点是可以让任何两个没有关联的类一起运行.

今天我们来看下代理模式。它就是让两个有关联的类一起运行

代理模式简介

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

使用代理模式的情况是,当访问对象不适合或者不能直接引用目标对象,我们生成一个代理对象作为访问对象和目标对象之间的中介。

通俗的来讲代理模式就是我们生活中常见的中介。通过对定义的理解,我们可以抽象出其中主要的角色:

  • 抽象主题(Subject)类(业务接口类):通过接口或抽象类声明真实主题和代理对象实现的业务方法,服务端需要实现该方法。

  • 真实主题(Real Subject)类(业务实现类):实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

代理模式分为三类:1. 静态代理 2. 动态代理 3. CGLIB代理;今天我们主要解析静态代理

静态代理

我们按照前面的定义来实现这三个角色类。以租房为例,我们一般用租房软件、找中介或者找房东。这里的中介就是代理者。首先定义一个提供了租房方法的接口--抽象主题

    void rentHouse();  
}  

定义租房的实现类--真实主题

public class RentHouse implements IRentHouse {  @Override  public void rentHouse() {  System.out.println("租了一间房子。。。");  }  
}  

我要租房,房源都在中介手中,所以找中介--代理

private IRentHouse rentHouse;  public IntermediaryProxy(IRentHouse irentHouse){  rentHouse = irentHouse;  }  @Override  public void rentHouse() {  System.out.println("交中介费");  rentHouse.rentHouse();  System.out.println("中介负责维修管理");  }  
}  

这里中介也实现了租房的接口,中介(代理)持有真实主题(房屋出租方)的引用。代理和被代理是有关系的,实现的是同一个接口!来测试下。

public static void main(String[] args){  //定义租房  IRentHouse rentHouse = new RentHouse();  //定义中介  IRentHouse intermediary = new IntermediaryProxy(rentHouse);  //中介租房  intermediary.rentHouse();  }  
}  

输出:交中介费输出:租了一间房子。。。输出:中介负责维修管理这就是静态代理,因为中介这个代理类已经事先写好了,只负责代理租房业务。并且在真实主题功能上进一个扩展了功能!

静态代理的问题

静态代理的问题有没有问题呢?
当然有!刚才我们就提到中介类是事先写好的!硬编码太严重!
给大家留个小作业:这样硬编码可能会导致哪些问题呢?

http://www.xdnf.cn/news/1398979.html

相关文章:

  • 深度学习基础:前馈网络、反向传播与梯度问题
  • 基于IEC61499开放自动化PLC数据储存方案
  • 在 WSL2-NVIDIA-Workbench 中安装Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整环境验证)
  • 第 8 篇:量化交易之tradeUI和webserverUI 区别?
  • 系统分析师考试大纲新旧版本深度分析与备考策略
  • 捡捡java——2、基础07
  • 开发指南136-设置零值不显示
  • vue中的与,或,非
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • [Windows] 剪映国际版CapCut 6.7.0 视频编辑处理,免费使用素材和滤镜
  • 拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开
  • LeetCode 136. 只出现一次的数字
  • [论文阅读] 人工智能 + 软件工程 | 从“法律条文”到“Gherkin脚本”:Claude与Llama谁更懂合规开发?
  • 普蓝自研AutoTrack-4X导航套件平台适配高校机器人实操应用
  • k8s(自写)
  • docker安装Prometheus和Grafana 监控界面
  • 为多种业态注入智能化发展新活力的智慧地产开源了
  • 从Java全栈开发视角看企业级应用架构设计与实践
  • C++转置正方形矩阵
  • 掌握表单:React中的受控组件与表单处理
  • 【物联网】BLE 系统架构全景图
  • 关于PXIe工控机XH-PXIe7312双路25G网卡
  • Docker核心概念与镜像仓库操作指南
  • FlowUs AI-FlowUs息流推出的AI创作助手
  • uniapp监听物理返回按钮事件
  • Ansible主机模式与文件导入技巧
  • C++世界的大门——基础知识总结
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(六)
  • 工业产品营销:概念、原理、流程与实践指南
  • 【浅尝Java】运算符全介绍(含除法取模运算各情况分析、位运算与移位运算分析、逻辑与条件运算符)