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

设计模式-7种结构型模式

适配器模式:

将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同调用。

桥接模式:

将类的抽象部分和他的实现部分分离开来。是他们可以独立的变化。

它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

例如画笔接口下具体的画笔实现,有粗画笔、细画笔,也有红色、蓝色,如果要是为每一种类都定义一个实现类,则会出现类爆发。所以只有将颜色也定义一个接口,粗细定义一个接口。然后画笔的抽象类将这两个接口组合起来。

Pen{

Color color;

Width width;

}

这个示例很多人都这么说,都在这么用,但是其实不合适。用画笔举例绝对所有人第一时间都会想到就应该这样的组合起来设计,怎么可能会去不同颜色不同粗细分别定义实现类。所以学习这个例子只会让人更懵。(把一个本来简单的问题复杂化,然后告诉你有一个模式可以把这个复杂问题变简单,有意思么?)

其实桥接模式的核心在于抽象部分和他的实现部分分离开来。

抽象部分就是有个工具箱接口utilinterface,定义了画画draw这个方法。

utilinterface{

viod draw();

}

实现部分就不是普通的去定义一个工具实现类来实现这个抽象类(utilClass implement utilinterface)并且实现画画方法来。而是另外一个不相干的实现类,例如不相干的画笔类PenClass实现具体的画画方法。同时将这个画笔工具类,作为utilinterface的实现类utilCalss类中的属性组合起来。就变成了如下:

utilCalss implement utilinterface {

PenClass  penClass=getXXPenClass();//先在构造方法或者某个地方配置某个具体的画笔类;

// utilCalss的画画功能其实是其中组合的penclass来执行的具体画画内容

viod draw(){ penClass.draw()};

}

这才是抽象部分和实现部分分离开来。才是通过组合关系代替继承关系。这才是桥接模式!

例如:Jdbc的DriverManager的getConnetion获取数据库连接的方法其实就是用的里面注册的具体的某个数据库驱动的连接方法生成的连接返回的。

组合模式:

将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式的核心思想是将对象看作是一个树形结构,其中每个节点可以是一个单独的对象(叶子节点)或者一个包含其他节点的容器(组合节点)。例如在java中可以通过组合模式来模拟文件系统,有node接口定义了顶层的操作接口,获取节点基本信息,查询子节点,新增子节点等。

装饰模式:

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。增加一个装饰器类,持有被装饰的对象,并且和被装饰对象实现相同的接口方法。但是重写方法加上额外的装饰功能(打印日志等)。(装饰模式和桥接模式都有一个对象持有另一个对象的这种相同点,但是器目的不同,桥接的目的是为了将抽象部分和实现部分分离。装饰器的目的是为了添加额外的职责)

外观模式:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。(例如ApplicationContext是Spring框架的核心容器,它隐藏了底层的复杂性,并提供了简单易用的接口供开发人员使用。通过ApplicationContext,开发人员可以轻松地获取和管理Spring管理的bean对象,而无需关注底层的实例化、依赖注入等细节)

享元模式:

运用共享技术有效地复用对象。减少系统中低等级的,详细的对象数目。减少了要处理的对象数目,减少了内存。(亨元对象能做到共享的关键是区分内部状态和外部状态。内部状态基本不改变,因此可以共享,基础的图元或者文字经常采用享元模式)Integer类有一些缓存机制,当int值在-128127之间时,会重用相同的Integer对象。这是因为JavaInteger类在这些值范围内实现了享元模式

代理模式:

将一个对象的行为代理给另一个对象。其实从结构上来说模式和装饰模式非常相似,都是一个代理类或者装饰类,持有被代理类或者被装饰类的引用。其区别在于:

1,目的不同:代理模式是为了控制对原对象的访问,隐藏真实对象。装饰模式是为了动态的增加原对象的功能。

2,实现方式:被代理对象通常不直接对外提供服务。被装饰类通常可以自行的对外体提供服务只是没有了被增强的功能而已。

3,代理模式中代理类与被代理类通常存在较强的耦合关系;而装饰模式中装饰类与被装饰类通常没有耦合关系,可以被随意替换。

相关文章:

设计模式-7种结构型模式

适配器模式: 将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同调用。 桥接模式: 将类的抽象部分和他的实现部分分离开来。是他们可以独立的变化。 它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两…...

华为李鹏:加速5G商业正循环,拥抱更繁荣的5.5G(5G-A)

2023年10月10日,在华为主办的第十四届全球移动宽带论坛上,华为高级副总裁、运营商BG总裁李鹏面向来自全球的运营商和产业伙伴,提出抓住网络需求和趋势的力量——“面向后天的业务,积极规划明天的网络,加速5G商业正循环…...

Marin说PCB之CoilcraftBourns POC 电感的性能对比

十一小长假本来是一件美好事情。可是天有不测风云,小编我却有祸兮来了。本来是公司的硬件同事强哥要回以色列了,最近他们国家那边都在打仗,强哥本着舍身为国的精神回国抗战去了。小编我就想着在他回国之前搞了篮球比赛送别一下他呢&#xff0…...

聊聊Maven的依赖传递、依赖管理、依赖作用域

1. 依赖传递 在Maven中&#xff0c;依赖是会传递的&#xff0c;假如在业务项目中引入了spring-boot-starter-web依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>…...

centos6/7 SOCKS5 堆溢出漏洞修复(RPM方式)curl 8.4 CVE-2023-38545 CVE-2023-38546

引用 https://darkdark.top/update-curl.html centos6 rpm 升级包下载&#xff1a;https://download.csdn.net/download/sinat_24092079/88425840 yum update libcurl-8.4.0-1.el6.1.x86_64.rpm curl-8.4.0-1.el6.1.x86_64.rpmcentos7 rpm 升级包下载&#xff1a;https://down…...

C#,数值计算——数据建模Proposal的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Proposal { public Normaldev gau { get; set; } null; private double logstep { get; set; } public Proposal(int ranseed, double lstep) { this.gau…...

如何使用命令生成动态链接库.dll文件(保姆级教学)

如何使用命令生成动态链接库.dll文件 /*** file 如何使用命令生成动态链接库.dll文件* author jUicE_g2R(qq:3406291309)* * brief 教学演示* tool visual studio2022&#xff08;2019也适用&#xff09;* * copyright 2023.10* COPYR…...

Qt之模块介绍

Qt提供了很多功能模块&#xff0c;我们需要知道的是这些模块有些加入了标准库&#xff0c;有一些并没有加入到标准库。至于为什么没有加入到标准库通过chatgpt得到的答案如下&#xff1a; Qt 是一个强大的跨平台 C 框架&#xff0c;它包括了很多核心模块和功能&#xff0c;以支…...

Socks5代理和代理IP

在数字时代&#xff0c;网络工程师必须不断掌握新技术&#xff0c;以解决跨界电商、爬虫数据采集、出海业务扩展、网络安全保护以及游戏性能优化等各种技术挑战。本文将深入探讨Socks5代理和代理IP技术&#xff0c;它们在各个领域中的应用&#xff0c;如何为网络工程师提供了强…...

计算机指令、机器码

目录 背景 在软硬件接口中&#xff0c;CPU 帮我们做了什么事&#xff1f; 从编译到汇编&#xff0c;代码怎么变成机器码&#xff1f; 解析指令和机器码 总结延伸 背景 上大学的时候&#xff0c;我们系里教 C 语言程序设计的老师说&#xff0c;他们当年学写程序的时候&…...

MyLife - Docker安装Consul

Docker安装Consul 个人觉得像consul之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装consul使用。 1. Consul 镜像库地址 Consul 镜像库地址&#xff1a;https://hub.docker.com/r/hashicorp/consu…...

Leetcode刷题笔记--Hot61-70

1--课程表&#xff08;207&#xff09; 主要思路&#xff1a; 用 in 记录每一门课程剩余的先修课程个数&#xff0c;当剩余先修课程个数为0时&#xff0c;将该课程加入到队列q中。 每修队列q中的课程&#xff0c;以该课程作为先修课程的所有课程&#xff0c;其剩余先修课程个数…...

python特别篇—github基本操作手册

一、开始使用 1.1 “Hello world” 1.1.1 github介绍 GitHub是一个基于Git版本控制系统的代码托管平台。它提供了一个在线的代码仓库&#xff0c;使开发者可以将自己的代码存储在云端&#xff0c;并与其他开发者进行协作。GitHub不仅仅是一个代码托管平台&#xff0c;还提供了…...

tiktok直播websocket序列化与反序列化

系列文章目录 websocket训练地址:https://www.qiulianmao.com,正在搭建中 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集tiktok protobuf序列化与反序列化实战一:Http轮询更新中tikto...

微信picker弹出之后 , 背景变成灰色是怎么做的

微信小程序在弹出picker组件时&#xff0c;会将页面背景变为半透明的灰色&#xff0c;这是通过设置一个全屏的蒙层来实现的。 具体实现方法如下&#xff1a; 在WXML文件中&#xff0c;添加一个view元素作为蒙层&#xff0c;并设置其样式和属性&#xff1a; <view class&q…...

通用考勤后台管理系统

考勤后台系统&#xff0c;包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能&#xff0c;本后台系统以考勤打卡为主要功能&#xff0c;采用分屏布局的方式&#xff0c;简洁大方&#xff0c;使用方便...

LeetCode75——Day5

文章目录 一、题目二、题解 一、题目 345. Reverse Vowels of a String Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more t…...

面向C++模块的开源 IFC SDK

早在 VS2019 v16.10 版本的时候&#xff0c;我们就官宣了对 C 模块(以及几乎所有其他 C 20 特性)的全面支持&#xff0c;包括 MSVC 编译器工具集&#xff0c;静态分析&#xff0c;智能感知和调试器等&#xff0c;而实现模块需要将 C 代码实现为一种内部的临时表示形式。 今天&…...

Docker开启远程访问+idea配置docker+dockerfile发布java项目

一、docker开启远程访问 1.编辑docker服务文件 vim /usr/lib/systemd/system/docker.servicedocker.service原文件如下&#xff1a; [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socke…...

基于nodejs+vue教学辅助管理系统

学生&#xff1b;首页、个人中心、本课程设计了线上教学辅助系统 ,学生可以此系统实现在线学习&#xff0c;作业提交管理、作业成绩管理。随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。教师&#xff1a;首页、个人中心、课程信息管理、教学资料管理、作业信息管…...

OFA-COCO蒸馏版部署教程:Windows WSL2环境下PyTorch服务调试全流程

OFA-COCO蒸馏版部署教程&#xff1a;Windows WSL2环境下PyTorch服务调试全流程 1. 引言&#xff1a;为什么选择OFA图像描述模型&#xff1f; 你有没有遇到过这样的场景&#xff1f;手头有一堆图片&#xff0c;需要为它们配上文字说明&#xff0c;一张张手动写描述&#xff0c…...

防爆气象站为什么能够成为化工行业的必备仪器

防爆气象站能够成为化工行业的必备仪器&#xff0c;主要基于其本质安全设计、多参数精准监测、实时预警能力、环境适应性、合规管理支持及生产优化价值六大核心优势&#xff0c;这些特性直接解决了化工行业在安全管控、工艺控制及合规运营中的关键痛点。一、本质安全设计&#…...

WSL+VSCode+Jupyter+R配置总结(2026年)

题记&#xff1a;网上相关的资料很多了&#xff0c;现阶段跟随AI也能少走很多弯路&#xff0c;但体验下来依旧有些细节没有被很好的提及&#xff0c;故写本文一方面作为自己的备忘录&#xff0c;一方面希望帮助更多像我一样的新手。 用了上述的配置跑了scanpy一年多了&#xf…...

微型LORA数传模块:科技赋能,传统楼宇智能蜕变

微型LoRa数传模块凭借小体积、低功耗、远距离、强穿透、易部署的核心优势&#xff0c;是智慧楼宇实现无线化、低成本、广覆盖物联网感知与控制的理想选择&#xff0c;尤其适合老旧楼宇改造与新建楼宇的轻量化智能化升级。一、核心优势(适配智慧楼宇场景)小体积易安装&#xff1…...

Linux下CMake多版本共存实战:不卸载旧版也能用上新功能

Linux下CMake多版本共存实战&#xff1a;不卸载旧版也能用上新功能 在软件开发的世界里&#xff0c;版本管理就像一场永不停歇的舞蹈。想象一下这样的场景&#xff1a;你正在维护一个历史悠久的C项目&#xff0c;突然客户要求你同时开发一个全新的模块&#xff0c;而这个模块需…...

多语言交易所/外汇系统源码/合约/期权/杠杆合约 秒合约/理财/申购

支持控盈亏等等功能支持合约、期权两大交易品类&#xff08;当前选中「期权」&#xff09;&#xff0c;以 XRP/USDT 为交易对示例&#xff0c;提供双向交易&#xff1a;买涨&#xff08;做多&#xff09;&#xff1a;预判价格上涨时开仓盈利买跌&#xff08;做空&#xff09;&a…...

DBShadow横空出世,Dapper.net的天花板盖不住了

一、DBShadow是什么DBShadow是.net开源的高性能ORMDBShadow使用开源项目ShadowSql高效拼接sqlDBShadow使用开源项目PocoEmit.Mapper高效映射查询参数和查询结果也就是说SqlBuilder(ShadowSql)OOM(PocoEmit.Mapper)ORM(DBShadow)二、DBShadow和Dapper对比一下1. Dapper代码await…...

从理论到面包板:手把手搭建Series-Shunt反馈放大器(含阻抗匹配避坑指南)

从理论到面包板&#xff1a;手把手搭建Series-Shunt反馈放大器&#xff08;含阻抗匹配避坑指南&#xff09; 在电子工程实践中&#xff0c;反馈放大器设计是模拟电路领域的核心技能之一。Series-Shunt结构因其出色的电压放大特性和相对简单的实现方式&#xff0c;成为初学者入门…...

2026最权威的降重复率工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AI检测系统会去对文本的语义连贯性展开多维分析&#xff0c;会对文本的句式结构进行多维…...

用8086和蜂鸣器DIY音乐盒:手把手教你复刻童年旋律(附完整汇编代码)

用8086和蜂鸣器DIY音乐盒&#xff1a;手把手教你复刻童年旋律&#xff08;附完整汇编代码&#xff09; 记得小时候第一次听到电子贺卡发出《生日快乐》的单调旋律时&#xff0c;那种机械却又神奇的"音乐"让我盯着电路板研究了半天。现在想来&#xff0c;那些简单的方…...