
计算机理论与基础
文章平均质量分 90
OceanStar的学习笔记
这个作者很懒,什么都没留下…
展开
-
linux内核:TCP实现之解析socket函数
在进行socket编程的第一步,一定是调用socket来创建一个句柄那么,这个socket是怎么实现的呢?ps:下文中的family与domain是同一个意思。转载 2023-05-10 22:07:18 · 908 阅读 · 0 评论 -
基础:Zookeeper、Eureka、Nacos、Consul ,Etcd选型
服务发现就是服务提供者将自己提供的地址post或者update到服务中介,服务消费者从服务中介那里get自己想要的服务的地址。原创 2023-04-26 14:13:10 · 2710 阅读 · 0 评论 -
性能: 网上常说性能测试是什么
性能测试是一种特殊的软件测试,它的目的是确保软件在一定的负载流量下运行良好。性能测试是性能分析和性能优化的基础,它的目标是发现和性能相关的各种问题和性能瓶颈,从而进一步去消除错误和性能瓶颈性能测试的分类方式性能测试如何分类呢?我们需要从几个方面来看,包括测试目的、测试环境、负载流量、测试对象、负载数据、黑盒白盒等。测试目的测试目的是最重要的方面。大体上有几种目的:测试服务速度:确定程序是否能够快速的响应用户的请求,这个服务速度一般包括延迟和吞吐量这两个指标。速度通常是应用程序最重要的属性之转载 2021-11-04 11:13:01 · 3248 阅读 · 2 评论 -
科普:24时区,GMT,UTC,DST,CST时间详解
时间戳一般指的UNIX时间,或类UNIX系统(比如Linux、MacOS等)使用的时间表示方式。转载 2018-11-14 18:51:11 · 67418 阅读 · 1 评论 -
高并发系统设计:消息队列,解决高并发写问题
为了解决后台将数据库的变化实时更新到前台的问题,我来了解一下消息队列文章目录1、为什么要使用消息队列2、使用了消息队列会有什么缺点?3、消息队列如何选型?4、如何保证消息队列是高可用的?1、为什么要使用消息队列三个最主要的应用场景:解耦、异步、削峰(1)解耦传统模式:传统模式的缺点:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统...转载 2019-01-19 13:04:41 · 6056 阅读 · 2 评论 -
基础:字符集与比较规则
那么,怎么在aaa1234这个字符集范围内比较两个字符的大小呢?常用的有二进制比较规则: 就是直接比较字符对应二进制编码的大小。比如b(0x02) >a(0x01)但是,有时候这并不符合现实要求。比如有时英文字母是不区分大小写的,也就是a == A。这个时候怎么比较呢?这时候就需要人为规定另外的比较方式了。先将字符全部转换为大写或者小写然后比较二进制同一种字符串可以有多种比较规则。转载 2021-10-18 22:49:08 · 472 阅读 · 0 评论 -
性能:操作系统是如何影响应用程序执行时间的
行锁在多个事务并发更新数据的时候,都是要在行级别加独占锁的,这就是行锁。独占锁都是互斥的,所以不可能发生脏写问题,一个事务提交了才会释放自己的独占锁,唤醒下一个事务执行。如果数据更新的时候,别的事务去读取这行数据,有两种可能:第一种可能是基于MVCC机制进行事务隔离,读取快照版本,这是比较常见的第二种可能是查询的同时基于特殊语法去加独占锁或者共享锁如果你查询的时候加独占锁,那么跟其他更新数据的事务加的独占锁都是互斥的;如果你查询的时候加共享锁,那么跟其他查询加的共享锁不是互斥的,但是跟转载 2021-12-24 11:57:09 · 529 阅读 · 0 评论 -
计算机组成原理:进程内存布局
每个进程所分配的内存由很多部分组成,通常叫做“段(segment)”,所下所示:文本段:程序的指令包含了进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自身指令。因为多个进程可以同时运行同一程序,所以又将文本段设置为可共享。这样,一份程序代码可以映射到所有这些进程的虚拟地址空间中数据段:程序使用的静态变量和全局变量初始化数据段:包含显式初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。未初始化数据段:段包含了未进行显式初始化转载 2021-05-23 15:40:40 · 424 阅读 · 0 评论 -
计算机组成原理:存储器层次结构全景
CPUCPU是计算机的大脑,主要和内存进行交互,从内存中读取指令然后并执行它。 一个CPU的执行周期是从内存中提取第一条指令,解码(成010101)并决定它的类型和操作数,执行;然后再提取,解码执行后续指令,重复该循环然后直到程序执行完毕。CPU主要由两部分组成:控制单元和算术逻辑单元(ALU)控制单元:从内存中提取指令并且解码运行算法逻辑单元:处理算术和逻辑运算从功能上看,CPU的内部由寄存器、控制器、运算器和时钟四部分组成,各部分之间通过电信号联通寄存器:用于暂存指令、数据和地址,可.转载 2020-10-14 14:32:15 · 3201 阅读 · 0 评论 -
软件工程:敏捷开发到底是想解决什么问题
诞生背景在 2001 年那会,瀑布模型还是主流,我们知道,瀑布模型是一种“重型”的开发模式,整个流程走完通常周期很长,少则数月,多则数年。长周期导致风险增加、难以响应变化。2001 初,17 位代表上述各种轻量级软件开发过程流派的领军人物聚集在一起,讨论替代瀑布模型这种重量级软件开发过程的新方法。但是没能达成一致,所以退而求其次,把大家都认同的理念整理出来,也就是后来的敏捷宣言。这些人还一起成立了敏捷联盟。敏捷宣言指出:敏捷不是一种方法论,也不是一种软件开发的具体方法,更不是一个框架或过程,而是一转载 2021-11-21 21:06:46 · 997 阅读 · 0 评论 -
计算机组成原理:CPU、核心,进程、线程,串行、并发、并行
在初期,技术上一个CPU上只能由一个核心,随着技术的进步,我们能够把多个CPU继承到一起,这种CPU我们就叫它多核CPU。转载 2020-09-07 17:49:29 · 4621 阅读 · 0 评论 -
计算机组成原理:CPU---计算机的大脑
比如说一个4核芯片上面承载了4个微型芯片,每个微型芯片上都有自己独立的CPU。多个CPU可以让多个程序并发的运行。转载 2020-11-27 13:56:26 · 3446 阅读 · 0 评论 -
持续集成:Travis CI
编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。为了提高软件开发的效率,构建和测试的自动化工具层出不穷。Travis CI 就是这类工具之中,市场份额最大的一个。是什么Travis-CI 是一个开源的持续构建项目,能够测试和部署;Travis-CI 会同步你在 GitHub 上托管的项目,每当你 Commit Push 之后,就会在几分钟内开始按照你的要求测试部署你的项目。目前 Travis-CI 分 http://travis-ci.org/ (Gi..转载 2022-05-12 17:47:34 · 413 阅读 · 0 评论 -
性能:eBPF是什么
eBPF的发展例程(1)1992年,包过滤机制BSD Packet Filter(BPF,后来也叫做Berkeley Packet Filter)出现,它是一种网络数据包过滤机制。主要有两个特点:内核态引入了一个新的虚拟机,所有指令都在内核虚拟机中运行用户态使用BPF字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行这就使得包过滤机制可以直接在内核中执行,避免了向用户态复制每个数据包,从而极大的提升了包过滤的性能(2)2015年,eBPF出现,它将BPF扩展为一个通用的虚拟机:将原本转载 2022-04-29 11:54:23 · 584 阅读 · 0 评论 -
redis:应用方如何正确连接sentinel
本节将介绍应用方如何正确的连接redis sentinel。有人说这有什么难的,已经知道了主节点的IP地址和端口,用对应编程语言的客户端连接主节点不就可以了吗?但试想一下,如果这样使用客户端,客户端连接redis sentinel和主从复制的redis又有什么区别呢,如果主节点挂了,虽然redis sentinel可以完成故障转移,但是客户端无法获取这个变化,那么使用redis sentinel的意义就不大了,所以各个语言的客户端需要对redis sentinel进行显式的支持。redis senti.转载 2021-10-12 20:43:54 · 2405 阅读 · 0 评论 -
redis:sentinel的安装与部署
redis sentinel具有如下几个功能:监控:sentinel节点会定期检测Redis数据节点、其余sentinel节点是否可达通知:sentinel节点会将故障转移的结果通知给应用方主节点故障转移:实现从节点晋升为主节点并维护后继的正确的主从关系配置提供者:在redis sentinel结构中,客户端在初始化的时候连接的是sentinel节点集合,从中获取主节点信息redis sentinel包含了若干个sentinel节点,这样做也带来了两个好处:对于节点的故障判断是由多个sen转载 2021-10-07 19:26:42 · 3427 阅读 · 0 评论 -
分布式:分布式共识
分布式选举问题,是从多个节点中选出一个主节点,相关的选举方法几乎都有一个共同特点:每个节点都有选举权和被选举权。大部分选举方法采用多数策略,也就是说一个节点只有得到了大部分节点的统一或认可才能成为主节点,然后主节点向其他节点宣告主权。其实,这个选主过程就是一个分布式共识问题,因为每个节点在选出主节点之前都可以认为自己会成为主节点,也就是说集群节点“存异”;而通过选举的过程选出主节点,让所有的节点都认为该主节点,这叫做“求同”。即分布式共识的本质就是“存异求同”所以,从本质是看,分布式选举问题,其实就是传转载 2022-02-08 17:01:37 · 804 阅读 · 0 评论 -
分布式:分布式选举算法
引入在分布式领域中,常听到的一个词是集群。那什么是集群呢?简单来说,集群一般是由两个或者两个以上的服务器组建而成,每个服务器都是一个节点。问题是,对于一个集群来说,多个节点到底是怎么协调,怎么管理的呢?比如,数据库集群中,如何保证写入的数据在每个节点上都是一致的呢?解决方法是选出一个“领导”来复杂调度和管理其他节点。这个所谓的“领导”,在分布式中叫做“主节点”,而选“领导”的过程叫做“分布式选举”。为什么要有分布式选举主节点,在一个分布式集群中负责对其他节点的协调和管理,也就是说,其他节点都必须服转载 2022-02-07 20:48:18 · 1598 阅读 · 0 评论 -
分布式:如何实现分布式互斥
什么是分布式互斥对于同一共享资源,同一时刻只能由一个程序能够访问这种资源。在分布式系统中,这种排他性的资源访问方式,叫做分布式互斥,而这种被互斥访问的共享资源就叫做临界资源。如何实现分布式互斥独裁者:集中式算法我们可以引入一个协调者,每个程序在需要访问临界资源时,先给协调者发送一个请求。如果当前没有程序使用这个资源,协调者直接授权请求程序访问;否则,按照先来后到的顺序为请求程序“排一个号”。如果有程序使用完资源,则通知协调者,协调者从“排号”的队列中取出排在最前面的请求,并给它发送授权信息。拿到授权转载 2022-02-07 19:41:43 · 593 阅读 · 0 评论 -
分布式:分布式系统的指标
分布式系统的指标分布式系统的出现就是为了用廉价的、普通的机器解决单个计算机处理复杂、大规模数据和任务时存在的性能问题、资源瓶颈问题,以及可用性和可扩展性问题。换句话说,分布式的目的时用更多的机器、处理更多的数据和更复杂的任务由此可以看出,性能、资源、可用性和可扩展性是分布式系统的重要指标。性能性能指标,主要用于衡量一个系统处理各种任务的能力。无论是分布式系统还是单机系统,都会对性能有所要求。不同的系统、服务要达成的目的不同,关注的性能自然也不尽相同,甚至是相互矛盾。常见的性能指标,包括吞吐量(Th转载 2021-01-04 11:15:01 · 811 阅读 · 0 评论 -
分布式:从单台计算机到分布式的演化
分布式起源单机模式所谓单机模式是指,所有应用程序和数据都部署在一台电脑或者服务器上,由一台计算机完成所有的处理。以铁路售票系统为例,铁路售票系统包括用户管理、火车票管理和订单管理等模块,数据包括用户数据、火车票数据和订单数据等,如果使用单机模式,那么所有的模块和数据均会部署在同一台计算机上,也就是说数据存储、请求处理均由该计算机完成。如下图:这种模式的好处是功能、代码和数据集中,便于维护、管理和执行。缺点是单个计算机的处理能力取决于 CPU 和内存等,但硬件的发展速度和性能是有限的,而且升级硬转载 2021-10-06 19:36:43 · 627 阅读 · 0 评论 -
计算机网络面试:关于Linux网络,你应该知道这些
引入同CPU、内存以及IO一样,网络也是Linux系统最核心的功能。网络是一种把不同计算机或者网络设备连接到一起的技术,它本质上是一种进程间通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行那么,Linux网络又是怎么工作的呢?又有哪些指标可以衡量网络的性能呢?网络模型说到网络,就会想到七层负载均衡、四层负载均衡,或者三层设备、二层设备等等。那么,这里说的二层、三层、四层、七层又都是什么意思呢?实际上,这些层都来⾃国际标准化组织制定的开放式系统互联通信参考模型(Open Sy转载 2021-10-27 09:53:22 · 669 阅读 · 2 评论 -
操作系统面试:死锁与银⾏家算法
什么是死锁所谓死锁,是指多个进程循环等待它方占有的资源而无限期的僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。当两个或者两个以上的进程同时对多个互斥资源提出使用要求时,很有可能导致死锁。必要条件(1)互斥条件。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或者两个以上的进程占有。这种独占资源比如打印机等,必须在占有该资源的进程主动释放它之后,其他进程才能占有该资源。这是由资源本身的属性所决定的。如独⽊桥就是⼀种独占资源,两⽅的⼈不能同时过桥。(2转载 2021-08-24 18:01:26 · 338 阅读 · 0 评论 -
操作系统面试:什么是进程
什么是进程进程指的是系统中正在运行的一个应用程序,程序一旦运行就是进程进程可以认为是程序执行的一个实例,进程是系统进程资源分配的最小单位(系统进行调度的最小单位是线程),而且每个进程都有自己独立的地址空间一个进程无法直接访问另一个进程的变量和数据结构,如果希望一个进程去访问另一个进程的资源,需要使用进程间通信线程是进程的在一个实体,是进程的一条执行路径;比进程更小的独立运行的基本单位,线程也被称为轻量级进程,一个程序至少有一个进程,一个进程至少有一个线程进程...转载 2022-01-23 20:50:54 · 494 阅读 · 0 评论 -
设计模式:总结
创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。单例模式单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。尽管单例是一个很常用的设计模式,在实际的开发中,我们也确实经常用到它,但是,有些人认为单例是一种反模式(anti-pattern),并不.转载 2022-01-06 16:52:34 · 159 阅读 · 2 评论 -
设计模式:中介模式
中介模式的原理和实现中介模式的英文翻译是 Mediator Design Pattern。定义为:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给中介对象交互,来避免对象之间的直接交互。实际上,中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟n个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性转载 2022-01-06 16:45:00 · 646 阅读 · 0 评论 -
设计模式: 解释器模式
解释器模式是用来描述如何构建一个简单的“语言”解释器。比起命令模式,解释器模式更加小众,只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。原理解释器模式的英文翻译是 Interpreter Design Pattern。定义:解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。这里的“语言”不仅仅指我们平时说的中、英、日、法等各种语言。从广义上来讲,只要是能承载信息的载体,我们都可以称之为“语言”,比如,古代的结绳记事、盲文、哑语、摩斯密码等。要想.转载 2022-01-06 16:26:52 · 436 阅读 · 0 评论 -
设计模式:命令模式
原理命令模式的英文翻译是 Command Design Pattern。定义为:命令模式将请求(命令)封装成一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能落实到编码实现,命令模式用的最核心的实现手段,是将函数封装成对象。我们知道,C语言支持函数指针,我们可以把函数当做变量传递来传递去。但是,在大部分编程语言中,函数没法作为参数传递给其他函数,也没法赋值给变量。借助命令模式,我们可以将函数封装成对象。转载 2022-01-06 15:39:56 · 229 阅读 · 0 评论 -
设计模式:备忘录模式
备忘录模式备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Pattern,应用场景比较明确和有限,主要是用来防丢失、撤销、恢复等。定义为:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容:第一部分:存储副本以便后期恢复第二部分:要在不违背封装原则的前提下,进行对象的备份和恢复问题是:为什么存储和恢复副本会违背封装原则?备忘录模式是如何做到不违背封装原则的?转载 2022-01-06 15:26:28 · 288 阅读 · 0 评论 -
设计模式:访问者模式
访问者模式在实际的软件开发中很少被用到,在没有特别必要的情况下,建议你不要使用访问者模式。带你“发明”访问者模式假设我们从网站上爬取了很多资源文件,它们的格式有三种:PDF、PPT、Word。我们现在要开发一个工具来处理这批资源文件,这个工具的其中一个功能是,把这些资源文件中的文本内容抽取出来放在txt文件中。怎么实现?如下,其中,ResourceFile 是一个抽象类,包含一个抽象函数 extract2txt()。PdfFile、PPTFile、WordFile 都继承 ResourceFile.转载 2022-01-06 14:57:50 · 197 阅读 · 0 评论 -
设计模式:迭代器模式
原理迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。它是用来遍历集合对象的。这里说的“集合对象”也可以叫做“容器”、“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、调表等。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。为了达到基于接口而非实现编程的目的,容器又包含容器接口、容器实现转载 2022-01-06 12:05:36 · 222 阅读 · 0 评论 -
设计模式:状态模式,游戏、工作流引擎中常用的状态机是如何实现的
状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。什么是有限状态机有限状态机,英文翻译是 Finite State Machine,缩写为 FSM,简称为状态机。状态机有3个组成部分:状态(State)、事件(Event)、动作(Action)。其中,事件也被称为转移条件(Transition Condition)。事件触发状态的转移以及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。举个例子。“超级马里奥”游戏中,马里奥可以变身为多种形态,比如小马里奥(.转载 2022-01-06 11:46:48 · 1515 阅读 · 2 评论 -
设计模式:职责链模式
职责链模式的原理职责链模式的英文翻译是 Chain Of Responsibility Design Pattern。定义为:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递多个请求,直到链上的某个接收对象能够处理它为止。在职责链模式中,多个处理器(也就是刚刚定义中的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完之后再传递给C处理器,以此类推,形成一个链条。链条上每个处理器各自承担各自的处理职转载 2022-01-06 10:53:20 · 392 阅读 · 0 评论 -
设计模式:策略模式,避免冗长的if-else/switch分支判断代码
策略模式的原理和实现策略模式,英文全称是 Strategy Design Pattern。定义为:定义彝族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端指的是使用算法的代码)我们知道,工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式解耦策略的定义、创建、使用者三部分策略的定义策略的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,转载 2022-01-06 10:07:32 · 2621 阅读 · 0 评论 -
模板模式:模板模式与callback回调函数有何区别
引入模板模式常用于框架开发中,通过提供功能扩展点,让框架用户在不修改源码的情况下,基于扩展点定制化框架的功能。除此之外,模板模式还可以起到代码复用的作用。复用和扩展是模板模式的两大作用。实际上,**回调(callback)**也能起到和目标模式相同的作用,那它们之间有什么区别和联系吗?回调的原理解析相对于普通的函数调用来说,回调是一种双向调用关系。A 类事先注册某个函数 F 到 B类,A 类在调用 B 类的 P 函数的时候,B 类反过来调用 A 类注册给它的 F 函数。这里的 F函数就是“回调函数”转载 2022-01-05 17:28:38 · 445 阅读 · 0 评论 -
设计模式:模板模式,剖析模板模式在JDK、Servlet、JUnit等中 的应用
原理模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。其定义为:模板方法,模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体架构的情况下,重新定义算法中的某些步骤。这里的算法,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,这也是模板方法模式的由来模板模式主要是用来解决复用和扩展两个问题。代码实现如下,te转载 2022-01-05 17:00:08 · 330 阅读 · 2 评论 -
设计模式:观察者模式,详解各种应用场景下观察者模式的不同实现方式
引入设计模式可以分为三类:创建型、结构型、行为型创建型设计模式主要解决“对象的创建”问题结构型设计模式主要解决“类或对象的组合或组装”问题行为型设计模式主要解决“类或对象之间的交互”问题行为型设计模式比较多,有11个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。这里我们主要关注观察者模式,也是实际中用的比较多的一种模式。原理观察者模式(Observer Desi转载 2022-01-05 16:08:19 · 2821 阅读 · 0 评论 -
设计模式:享元模式,剖析享元模式在Java Integer、String中的应用
享元模式在 Java Integer 中的应用我们先来看下面这样一段代码。你可以先思考下,这段代码会输出什么样的结果。Integer i1 = 56;Integer i2 = 56;Integer i3 = 129;Integer i4 = 129;System.out.println(i1 == i2);System.out.println(i3 == i4);如果不熟悉 Java 语言,你可能会觉得,i1 和 i2 值都是 56,i3 和 i4 值都是 129,i1 跟 i2值相等,i转载 2022-01-05 15:46:52 · 401 阅读 · 0 评论 -
设计模式:享元模式,如何利用享元模式优化内存占用
享元模式的原理与实现所谓”享元“,就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元模式是不可变的对象。具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段)提取出来,设计成享元,让这些大量相似对象引用这些享元。定义中的“不可变对象”转载 2022-01-05 15:26:50 · 427 阅读 · 0 评论 -
设计模式:组合模式,如何设计实现支持递归遍历的文件系统目录树结构
引入组合模式跟面向对象对象设计中的“组合关系(通过组合来组织两个类)”,完全是两码事。这里的“组合模式”,主要是用来处理树形结构数据。这里的“数据”,可以简单理解为一组对象集合正因为其应用场景的特殊性,数据必须能表示成树形结构,这也导致了这种模式在实际开发中不那么常用。但是,一旦数据满足树形结构,应用这种模式就能发挥很大的作用,让代码变得非常简洁组合模式的原理和实现在 GoF 的《设计模式》,组合模式定义:将一组数据组织成树形结构,以表示一种“部分-整体”的层次结构。组合让客户端(在很多设计模式书转载 2022-01-05 12:06:02 · 659 阅读 · 0 评论