设计模式——结构型模式

news2024/11/20 20:28:08

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。

由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

结构型模式分为以下 7 种:

  • 代理模式
  • 适配器模式
  • 装饰者模式
  • 桥接模式
  • 外观模式
  • 组合模式
  • 享元模式

5.1 代理模式

5.1.1 概述

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介

Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。

5.1.2 结构

代理(Proxy)模式分为三种角色:

  • 抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

5.1.3 静态代理

我们通过案例来感受一下静态代理。

【例】火车站卖票

如果要买火车票的话,需要去火车站买票,坐车到火车站,排队等一系列的操作,显然比较麻烦。而火车站在多个地方都有代售点,我们去代售点买票就方便很多了。这个例子其实就是典型的代理模式,火车站是目标对象,代售点是代理对象。类图如下:

代码如下:

//卖票接口
public interface SellTickets {
    void sell();
}
​
//火车站  火车站具有卖票功能,所以需要实现SellTickets接口
public class TrainStation implements SellTickets {
​
    public void sell() {
        System.out.println("火车站卖票");
    }
}
​
//代售点
public class ProxyPoint implements SellTickets {
​
    private TrainStation station = new TrainStation();
​
    public void sell() {
        System.out.println("代理点收取一些服务费用");
        station.sell();
    }
}
​
//测试类
public class Client {
    public static void main(String[] args) {
        ProxyPoint pp = new ProxyPoint();
        pp.sell();
    }
}

从上面代码中可以看出测试类直接访问的是ProxyPoint类对象,也就是说ProxyPoint作为访问对象和目标对象的中介。同时也对sell方法进行了增强(代理点收取一些服务费用)。

5.1.4 JDK动态代理

接下来我们使用动态代理实现上面案例,先说说JDK提供的动态代理。Java中提供了一个动态代理类Proxy,Proxy并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance方法)来获取代理对象。

代码如下:

//卖票接口
public interface SellTickets {
    void sell();
}
​
//火车站  火车站具有卖票功能,所以需要实现SellTickets接口
public class TrainStation implements SellTickets {
​
    public void sell() {
        System.out.println("火车站卖票");
    }
}
​
//代理工厂,用来创建代理对象
public class ProxyFactory {
​
    private TrainStation station = new TrainStation();
​
    public SellTickets getProxyObject() {
        //使用Proxy获取代理对象
        /*
            newProxyInstance()方法参数说明:
                ClassLoader loader : 类加载器,用于加载代理类,使用真实对象的类加载器即可
                Class<?>[] interfaces : 真实对象所实现的接口,代理模式真实对象和代理对象实现相同的接口
                InvocationHandler h : 代理对象的调用处理程序
         */
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(station.getClass().getClassLoader(),
                station.getClass().getInterfaces(),
                new InvocationHandler() {
                    /*
                        InvocationHandler中invoke方法参数说明:
                            proxy : 代理对象
                            method : 对应于在代理对象上调用的接口方法的 Method 实例
                            args : 代理对象调用接口方法时传递的实际参数
                     */
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
​
                        System.out.println("代理点收取一些服务费用(JDK动态代理方式)");
                        //执行真实对象
                        Object result = method.invoke(station, args);
                        return result;
                    }
                });
        return sellTickets;
    }
}
​
//测试类
public class Client {
    public static void main(String[] args) {
        //获取代理对象
        ProxyFactory factory = new ProxyFactory();
        
        SellTickets proxyObject = factory.getProxyObject();
        proxyObject.sell();
    }
}
 
    
1118

使用了动态代理,我们思考下面问题:

  • ProxyFactory是代理类吗?

    ProxyFactory不是代理模式中所说的代理类,而代理类是程序在运行过程中动态的在内存中生成的类。通过阿里巴巴开源的 Java 诊断工具(Artha

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1232741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

递归和分治

递归 递归&#xff08;英语&#xff1a;Recursion&#xff09;&#xff0c;在计算机科学中&#xff0c;递归指的是一个函数在其定义中调用自身的方法。这种技术允许程序解决复杂问题&#xff0c;通过将它们分解为更小、更易管理的相似问题。递归通常与分治策略相关联&#xff…

5-Nacos环境搭建

本文介绍nacos集群环境的搭建。 1、基础环境 机器&#xff1a;mac&#xff0c;intel版本jdk&#xff1a;1.8数据库&#xff1a;mysql 8.029nacos&#xff1a;2.03 2、下载 nacos点击这里下载。 3、开始配置 这里搭建在自己机器上搭建两台nacos集群。下载完成后&#xff0…

Mac使用unrar和rar解压文件

WinRAR archiver, a powerful tool to process RAR and ZIP files 下载 tar -xzvf rarmacos-x64-624.tar.gz cd rar # 安装rar命令 sudo install -c -o $USER rar /usr/local/bin/ # 安装unrar命令 sudo install -c -o $USER unrar /usr/local/bin/ 压缩rar a test.rar readme…

智慧工地网络广播系统

智慧工地网络广播系统 智慧工地网络广播&#xff0c;是智慧公司不可缺少的一环&#xff0c;对于工地广播来说&#xff0c;音质和传输稳定性都是非常重要的要素。尤其是在高楼大厦密集的地方&#xff0c;可能会存在信号干扰和传输受阻的情况&#xff0c;这时候可以考虑使用网络…

hadoop 配置历史服务器 开启历史服务器查看 hadoop (十)

1. 配置了三台服务器&#xff0c;hadoop22, hadoop23, hadoop24 2. hadoop文件路径: /opt/module/hadoop-3.3.4 3. hadoop22机器配置历史服务器的配置文件&#xff1a; 文件路径&#xff1a;/opt/module/hadoop-3.3.4/etc/hadoop 文件名称&#xff1a;mapred-size.xml 新增历…

一文带你了解MySQL数据库基础

✏️✏️✏️今天给各位带来的是关于数据库基础方面的知识。 清风的CDSN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点…

kubernetes测试部署一个nginx

在kubenetes集群中部署一个nginx程序测试集群是否能正常工作 #部署nginx程序 [rootmaster ~]# kubectl create deployment nginx --imagenginx:1.18-alpine #开放端口 [rootmaster ~]# kubectl expose deployment nginx --port80 --typeNodePort #查看pod状态 [rootmaster …

电脑开不了机怎么办?三招帮你成功解决!

电脑是我们日常工作和生活的重要工具&#xff0c;但有时候它们也会出现开机问题。当电脑无法启动时&#xff0c;可能会让人感到焦虑&#xff0c;电脑开不了机怎么办&#xff1f;不必担心&#xff0c;通常有多种方法可以解决这些问题。本文将介绍三种常见的方法&#xff0c;以帮…

【工具与中间件】IDEA工具的使用:热部署、快捷键与版本控制

文章目录 0. 前言1. IDEA 配置热部署2. IDEA 常用快捷键3. IDEA 绑定GIT4. 小结 IDEA工具配置热部署&#xff0c;让我们的开发更有效率 0. 前言 以下是水文字&#xff0c;心急的读者可以直接阅读下面的章节。 有时&#xff0c;新&#xff0c;先进的东西确实可以给这个时代的…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)一

第二部分&#xff1a;Shell编程&#xff08;一&#xff09; 这一章我们正式进入 Shell 脚本编程&#xff0c;重点讲解变量、字符串、数组、数学计算、选择结构、循环结构和函数。 Shell 的编程思想虽然和 C、Java、Python、C# 等其它编程语言类似&#xff0c;但是在语法细节方…

Zynq-Linux移植学习笔记之66- 国产ZYNQ通过裕太PHY8521连接国产交换芯片

1、背景介绍 ZYNQ通过裕太PHY 8521主要连接两种国产交换芯片&#xff0c;一种为盛科的CTC8096&#xff0c;另一种为32所的JEM5396。框图示意如下&#xff1a; 2、硬件状态确认 首先检查phy的模式&#xff0c;确认为SGMII_MAC-RGMII_PHY 可通过读出A001寄存器确认状态 读出来应…

LeetCode(31)无重复字符的最长子串【滑动窗口】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 无重复字符的最长子串 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

APP外包开发项目验收

应用外包开发的验收是确保项目交付质量和客户满意度的关键阶段。以下是一些建议&#xff0c;帮助你进行有效的APP外包开发验收&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确验收标准&#xf…

[Android] Amazon 的 android 音视频开发文档

https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3

掌握源码,轻松搭建:一站式建站系统源码 附完整搭建步骤与教程

随着互联网的快速发展&#xff0c;网站已成为人们生活中不可或缺的一部分。然而&#xff0c;对于许多初学者或中小企业来说&#xff0c;搭建一个完整的网站系统并非易事。这涉及到前端和后端的开发、数据库管理等多个环节。为了解决这一痛点&#xff0c;我们推出了一站式建站系…

Double 4 VR智能互动系统在轨道交通实训教学中的应用

Double 4 VR智能互动系统是一种集成了虚拟现实技术、人工智能和物联网技术的教学系统。计算机通过模拟真实的轨道交通环境&#xff0c;为学生提供了一个高度仿真的学习环境&#xff0c;帮助他们更好地理解和掌握轨道交通的相关知识和技能。 首先&#xff0c;Double 4 VR智能互动…

第十篇 基于JSP 技术的网上购书系统——管理员后台管理主界面、订单管理、产品管理功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.管理员后台管理——主界面 1.1功能说明 1.2界面设计 1.3处理流程 2.订单管理 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关系 2.4.4相关sql实例 3.产品管理 3.1功能说明 3.2界面设计 3.3处理流程…

第十一篇 基于JSP 技术的网上购书系统——产品类别管理、评论/留言管理、注册用户管理、新闻管理功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.产品类别管理 1.1功能说明 1.2界面设计 1.3处理流程 1.4数据来源和算法 1.4.1数据来源 1.4.2 查询条件 1.4.3相关sql实例 2. 评论/留言管理 2.1功能说明 2.2 界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2 查询条件 2.4.3相关sql实例…

【AI】行业消息精选和分析(11月21日 星期二)

技术发展 &#x1f525; OpenAI 员工集体签署信件&#xff1a; - 员工要求董事会辞职并重新任命首席执行官奥特曼。 - 否则可能集体加入微软。 昨天就玩我们领导发言&#xff0c;后面大家接龙收到的那一套了。 &#x1f632; 奥特曼加入微软引发猜测&#xff1a; - 对于一个公…