设计模式下

一、代理模式

        一、概念

        代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引 用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表, 其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。

        例如:去4s店买车。

        二、优点

        代理模式将目标对象与客户端分离 ,起中介和保护目标对象作用,降低了耦合度。

        扩展目标对象功能。

        三、代理模式结构

四、代理模式分类

        代理模式分为静态代理与动态代理。

        一、静态代理

        静态代理模式的特点,代理类接受一个 Subject 接口的对象,任何实现该接 口的对象,都可以通过代理类进行代理,增加了通用性。

        优点:

        可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

        缺点:

        一个代理类只能代理一个接口,工作量太大;代理类是运行前编码已 经完成的;必须先有接口,再有代理;接口一旦发生变量,代理类也要修改。

        二、动态代理

        在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态 处理器就可以了。真正的代理对象在运行时为我们动态的来创建。       

        动态代理分为jdk代理和cglib代理。

        1.jdk代理

        是通过反射来实现的,借助 Java 自带的java.lang.reflect.Proxy,通过固定的规则生成。

        jdk代理实现方法:

        1. 编写一个委托类的接口,即静态代理的

        2. 实现一个真正的委托类,即静态代理的

        3. 创建一个动态代理类,实现 InvocationHandler 接口,并重写该 invoke 方法

        4. 在测试类中,生成动态代理的对象。

        总结:

        虽然相对于静态代理,动态代理大大减少了我们的开发任务,同时减少了 对业务接口的依赖,降低了耦合度。但是它始终无法摆脱仅支持 interface 代理的桎梏,只能对接口进行代理。

        2.cglib代理

        CGLib 采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建 子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切 逻辑。

        Cglib 代理实现方法:

        1.需要引入 cglib 的 jar 文件,但是 Spring 的核心包中已经包括了 Cglib 功能,所 以直接引入 spring-core-xxx.jar 即可.

        2.引入功能包后,就可以在内存中动态构建子类

        3.代理的类不能为 final,否则报错

        4.目标对象的方法如果为 final/static,那么就不会被拦截,即不会执行目标对象额 外的业务方法.

         总结:       

         CGLIB 创建的动态代理对象比JDK 创建的动态代理对象的性能更高,但是 CGLIB 创建代理对象时所花费的时间却比 JDK 多得多。所以对于单例的对象,因为无需频繁创建对象,用 CGLIB 合适,反之使用 JDK 方式要更为合适一些。同时由 于 CGLib 由于是采用动态创建子类的方法,对于 final 修饰的方法无法进行代理。

二、适配器模式

        定义:

        将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容 而不能一起工作的那些类能一起工作。

        适配器模式(Adapter)包含以下主要角色:

        目标(Target):当前系统业务所期待的功能,它可以是抽象类或接口,相当于 欧标插座。

        适配者(Adaptee):需要被适配的对象或类型,相当于标准插头。

        适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。

        实现方式:

        适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中, 该类同时实现当前系统的业务接口。

三、模板方法模式

        程序开发中,有些实现步骤流程时固定的,可以抽取父类,在父类中实现各个步骤,再在父类中定义一个流程控制方法,在此方法中按照步骤调用执行,可以将某个容易发生变化的步骤定义为抽象方法,针对不同情况,可扩展一个子类实现抽象方法,最终由子类对象调用父类中流程控制方法即可。

        定义

        定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类 可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

 模板方法(Template Method)模式包含以下主要角色:

        抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法 构成。

                模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

                抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。

                具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可 以进行覆盖也可以直接继承。

        具体子类:实现抽象类中所定义的抽象方法,它们是一个组成步骤。

        优点:

        提高代码复用性,将相同部分的代码放在抽象的父类中,而将不同的代码放 入不同的子类中。 实现了反向控制,通过一个父类调用其子类的操作,通过对子类的具体实现 扩展不同的行为,实现了反向控制 ,并符合“开闭原则”。

        缺点:

        对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加 庞大,设计也更加抽象。 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,它提高 了代码阅读的难度。

四、策略模式

        可以将同一种功能不同实现细节先抽取一个抽象接口/抽象类。然后把不同的实现让子类。

       定义

        该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算 法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法 进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这 些算法进行管理。

        策略模式的主要角色如下:

        抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。 此角色给出所有的具体策略类所需的接口。

        具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的 算法实现或行为。

        环境(Context)类:持有一个策略类的引用,最终给客户端调用。

        优点:

        策略类之间可以自由切换,由于策略类都实现同一个接口,所以使它们之间可以 自由切换。 易于扩展,增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改 变原有的代码,符合“开闭原则“, 避免使用多重条件选择语句(if else),充 分体现面向对象设计思想。

五、观察者模式

        定义:

        又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依 赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化 时,会通知所有的观察者对象,使他们能够自动更新自己。

        在观察者模式中有如下角色:

        抽象主题(抽象被观察者):抽象主题角色把所有观察者对象保存在一个集合里, 每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除 观察者对象。

        具体主题(具体被观察者):该角色将有关状态存入具体观察者对象,在具体主 题的内部状态发生改变时,给所有注册过的观察者发送通知。

        抽象观察者:是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改 通知时更新自己。

        具体观察者:实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新 自身的状态。

        优点:

        降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装 nvm

前言: nvm 即 node 版本管理工具 (node version manager),好处是方便切换 node.js 版本。 通过将多个 node 版本安装在指定路径,然后通过 nvm 命令切换时,就会切换我们环境变量中 node 命令指定的实际执行的软件路径。 使用场景…

Selenium自动化测试之学会元素定位

这是我经常被问到的一个问题,也是我很讨厌回答的问题,因为要想回答这个问题需要知道上下文。什么样式的元素,有哪些属性,是否有表单嵌套,都尝试了哪些定位方法。。。而且没几个提问者能事先详细的说明这些。哪儿像提bu…

宠物互联网医院系统:数字化呵护你爱宠的新时代

宠物互联网医院系统正在为宠物主人提供一种前所未有的数字化健康护理体验。通过结合创新技术,这一系统旨在让宠物医疗变得更加便捷、智能和个性化。让我们深入探讨宠物互联网医院系统的技术核心,以及如何应用代码为你的爱宠提供最佳关怀。 1. 远程医疗…

操作系统-进程控制(如何实现进程控制 如何实现原子性 相关进程控制原语)

文章目录 什么是进程控制总览如何实现进程控制?如何实现原语的“原子性”?进程控制相关的原语创建原语撤销原语子进程与父进程阻塞与唤醒原语切换原语 小结 什么是进程控制 控制进程的状态变换 总览 如何实现进程控制? 原语实现 假设不是原…

离线直线度测量仪的三种类型

智能型离线直线度测径仪主要用于金属棒材、管材、陶瓷管材等产品在生产节拍时间充裕时的直径和直线度检测。测量方便,自动将检测数据显示于显示屏上。 离线直线度测量仪使用前,设置产品规格,在更换轧材规格时,在设置一次&#xff…

强化学习:MuJoCo机器人强化学习仿真入门(1)

声明:我们跳过mujoco环境的搭建,搭建环境不难,可自行百度 下面开始进入正题(需要有一定的python基础与xml基础): 下面进入到建立机器人模型的部分: 需要先介绍URDF模型文件和导出MJCF格式 介绍完…

【MATLAB源码-第123期】基于matlab的SSK(空间位移键控)调制和QSSK(正交空间位移键控)调制误码率对比。

操作环境: MATLAB 2022a 1、算法描述 1. SSK(空间位移键控): - 基本原理:SSK是一种MIMO(多输入多输出)系统中的调制技术。它通过选择性地激活不同的发送天线来传输信息。在每个时间槽&…

第十三回 赤发鬼醉卧灵官殿 晁天王认义东溪村-FreeBSD 下编辑文件ee 用法

话说雷横绑了一个大汉,先押到晁保正庄上讨些点心吃。这东溪村的保正叫晁盖,人称他托塔天王。晁盖热情接待了雷横和士兵们,自己却趁着他们喝酒的时候尿遁去看那大汉。原来那大汉就是来找晁保正的,于是谎称他是晁盖的外甥&#xff0…

【K8S 云原生】K8S的包包管理器-helm

目录 一、helm概念 1、什么是helm 2、helm的概念: 二、实验部署: 1、安装helm: 2、对chart仓库的基本使用: 2.1、查看和更新chart仓库 2.2、安装chart 2.3、卸载chart: 3、helm自定义模版: 3.1、…

【Linux】【实战系列】10 分钟掌握日常开发中 Linux 网络处理相关命令

文章目录 lsofnetstatpingnslookupsshssh-keygenscpsftp 网络工具 curl网络工具 wget最后个人简介 hello,大家好,我是 Lorin,上一期和大家分享一期日常开发中常用的 Linux 文件和文本命令实战教学,这一期给大家带来常用的网络处理…

k8s部署Ingress

前提:有自备的域名,没有域名可用主机配置的域名解析代替测试 #主机配置的域名 vi /etc/hosts #追加以下内容 127.0.0.1 kuboard1、部署Ingress vi deploy.yaml #输入以下内容apiVersion: v1 kind: Namespace metadata:labels:app.kubernetes.io/instan…

git使用指南——以gitlab为例

注册gitlab 自行注册 新建项目 选择新建一个空白的项目 上传项目 clone项目地址到本地 执行完之后,会在目录下生成如下内容:进入里面,选择.git,要上传的内容(资料或代码复制到该目录下):…

华夏基金“冰火两重天”:产品增量不增值,靠什么赢得用户?

近日,华夏基金发布关于华夏野村日经225交易型开放式指数证券投资基金(QDII)(下称“华夏野村日经ETF”)二级市场交易价格溢价风险提示及临时停牌公告。 公告内容显示,华夏野村日经ETF二级市场交易价格明显高…

Prometheus 架构全面解析

在本指南中,我们将详细介绍 Prometheus 架构。 Prometheus 是一个用 Golang 编写的开源监控和告警系统,能够收集和处理来自各种目标的指标。您还可以查询、查看、分析指标,并根据阈值收到警报。 此外,在当今世界,可观…

如何使用宝塔面板搭建Discuz论坛服务并结合内网穿透远程访问

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board(以下简称 Discuz!)是一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上&a…

架构篇18:单服务器高性能模式-PPC与TPC

文章目录 PPCpreforkTPCprethread小结高性能是每个程序员的追求,无论我们是做一个系统还是写一行代码,都希望能够达到高性能的效果,而高性能又是最复杂的一环,磁盘、操作系统、CPU、内存、缓存、网络、编程语言、架构等,每个都有可能影响系统达到高性能,一行不恰当的 deb…

【强化学习】QAC、A2C、A3C学习笔记

强化学习算法:QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式,它通过梯度上升方法来寻找最优策略。然而,REINFORCE算法也有其局限性,采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…

力扣hot100 环形链表 快慢指针 哈希 数学公式

Problem: 142. 环形链表 II 文章目录 思路Code 思路 👨‍🏫 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) 🌎 空间复杂度: O ( 1 ) O(1) O(1) /** /*** Definition for singly-linked list.* class ListNode {* int val;* …

C++大学教程(第九版)6.29素数

题目 (素数)素数是只能被1和自已整除的整数。例如,235和7是素数而468和9不是素数 a)编写一个函数,确定一个数是否是素数。 b)在程序中使用这个函数,该程序确定和打印2 ~10000之间的所有素数。在确信已找到所有的素数之前,实际需测试这些数中…

老师家访的目的是什么

家访,对于老师来说,是工作中必不可少的一部分。有人会问,老师家访的目的是什么呢?是为了了解学生的家庭情况,还是为了和家长建立良好的沟通关系?其实,老师家访的目的远不止于此。 老师家访是为…