当前位置: 首页 > 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.dtcms.com/a/358169.html

相关文章:

  • observer pattern 最简上手笔记
  • REST API 是无状态的吗,如何保障 API 的安全调用?
  • [ZJCTF 2019]NiZhuanSiWei
  • [BUUCTF]jarvisoj_level3_x64详解(含思考过程、含知识点讲解)
  • 批量采集培训机构数据进行查询
  • Axios 实例配置指南
  • 基于物联网设计的园林灌溉系统(华为云IOT)_274
  • k8s--efk日志收集
  • PostgreSQL令牌机制解析
  • C++多态介绍
  • sunset: sunrise
  • 安全多方计算(MPC):技术原理、典型应用与 Python 工程实现详解
  • POLAR 社区交流平台 PRD v1.0
  • DDR5 介绍
  • 关于PXIe工控机的网速问题XH-PXIe7313万兆网卡
  • 【LeetCode每日一题】21. 合并两个有序链表 2. 两数相加
  • Linux三剑客grep-sed-awk
  • # `std::basic_istream`总结
  • 从零到一:使用Flask构建“我的笔记”网站
  • Elasticsearch面试精讲 Day 2:索引、文档与映射机制
  • 如何在 Jenkins Docker 容器中切换到 root 用户并解决权限问题
  • WPF和WinFrom区别
  • WPF中的ref和out
  • 基于Ubuntu本地GitLab 搭建 Git 服务器
  • 小迪安全v2023学习笔记(七十四讲)—— 验证机制篇验证码绕过思路SRC挖掘演示
  • web渗透ASP.NET(Webform)反序列化漏洞
  • SpringBoot整合Actuator实现健康检查
  • windows系统中安装zip版本mysql,配置环境
  • Spring Cloud Gateway 网关(五)
  • 电子战:Maritime SIGINT Architecture Technical Standards Handbook