自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 收藏
  • 关注

转载 狂神Java全栈学习路线

Java全栈学习路线一、Java基础二、JavaWeb三、SSM框架四、Linux运维五、微服务和分布式六、大数据开发七、持续学习一、Java基础二、JavaWeb三、SSM框架四、Linux运维五、微服务和分布式六、大数据开发七、持续学习注:本路线是转载狂胜说Java...

2020-07-25 11:16:01 5193

原创 优雅的安装Docker以及Docker-compose(附带镜像加速哦)

有人会问:为什么不直接apt 或者 yum 安装?我的回答:我喜欢把控每个细节的感觉安装了的需要卸载 Docker!!!里面有两个文件可能直接在 linux 下载不下来,需要手动下载后上传到 linux ,脚本中会根据不同的 linux 架构输出不同的地址。

2023-04-03 18:32:34 508 1

原创 RabbitMQ 之 延迟队列篇

1 延迟队列概念延时队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。2 延迟队列使用场景订单在十分钟之内未支付则自动取消。新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。用户注册成功后,如果三天内没有登陆则进行短信提醒。用户发起退款,如果三天内没有得到处理则通知相关运营人员。预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。  

2022-01-08 15:47:46 495

原创 RabbitMQ之死信队列篇

1 死信的概念  先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的信息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。  应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死

2022-01-08 00:12:53 399

原创 RabbitMQ之交换机篇

1 交换机  在之前的文章中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式称为 ”发布/订阅”。  为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消息,第二个程序是消费者。其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上,事实上第一个程序发出的日志消息将广播给所有消费者。

2022-01-07 23:19:53 240

原创 RabbitMQ之Work Queues(轮询分发、消息应答、持久化、不公平分发)

1 Work Queues工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些务。1.1 轮训分发消息在这个案例中我们会启动两个工作线程,一个消息发送线程,我们来看看他们两个工作线程是如何工作的。1.1.1 工具类抽取public class RabbitMQUtils { /** * 得

2022-01-07 22:07:04 339

原创 什么是RabbitMQ-Hello World

1 MQ的相关概念1.1 什么是MQ  MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。1.2 为什么要用MQ流量消峰  举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下

2022-01-07 17:58:22 161

原创 RabbitMQ发布确认

1、发布确认原理   生产者 将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker 回传给生产者的确认消息中 delivery-tag 域包含了确认消息的序列号,此外 broker 也可

2022-01-07 16:07:41 598

原创 堆排序【带图演示】

一、前提知识预备在了解堆排序前,补充一下堆的知识吧,它的结构可以分为大根堆和小根堆,是一颗完全二叉树大根堆和小根堆每个节点的值都大于等于其左右节点的值称为大根堆,那小于等于就称为小根堆。如下图:既然是个完全二叉树,节点之间有规则可言,假如已知节点的下标为 i,那么:父节点的下标为:( i - 1 ) / 2左孩子的下标为: i * 2 + 1右孩子的下标为:i * 2 + 2所以当一个数组要排序的时候,需要建立一个堆,并满足以下性质:大根堆:arr[ i ] >= ar

2021-11-15 15:32:34 2239

原创 快速排序(萝卜填坑算法)【必会知识】

快速排序  话说叫快排快排,但是在某种某件下会变成慢排,好了好了,进入正文快排也是采用了一种分治的策略,该方法的基本思想是:1、先找一个基数,我一般用第一个数2、然后把比基数小的方左边,比基数大的方右边,然后以基数下边为分界线,划分左右区间3、然后左右区间进行重复的操作4、最后会得到 n 个有序的区间直接举例子吧现在有一个无序的数组 arr ????我们现在取第一个元素为基数 也就是 pivot=arr[0] = 77,left 下标为 0 ,right下标为 7 ,现在

2021-11-12 18:00:14 786

原创 归并排序(MergeSort)

归并排序概念归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的。利用归并的思想实现排序,该方法采用经典的分治策略,分成一些小的问题然后递归求解, 而治的阶段则将分的阶段得到各答案"修补"在一起即分而治之。算法原理这个地方不太好用文字描述,直接举个小栗子吧1、这里有一组无序数组2、总体流程我大致说一下我的理解红色部分按 n / 2 进行递归分

2021-11-11 17:50:29 1345

原创 插入排序【必会知识】之优化(希尔排序)

插入排序插入排序也是一种常见的排序算法,插入排序的思想是:将数据分为有序部分和无序部分,每一步将一个无序部分的数据插入到前面已经排好序的有序部分中,直到插完所有元素为止。时间复杂度:O(n^2)稳定性:稳定直接上动态图:代码演示/** * 插入排序 10W 条数据 平均花费 1 S */public class InsertSort { public static void insertSort(int[] arr) { //为空或者长度小于2直接返回

2021-11-10 17:28:58 761

原创 选择排序【必会知识】

选择排序顾名思义,选择,选择,就是靠选择来排序,那是个什么选择法呢?之前的冒泡排序是在一趟中可能交换多次数据,但是在选择排序中,在一趟跑完后,会在未排序的数据中选择一个最大(小)值的下标,然后再进行一次交换。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素(一般就是第一个元素),存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置,直到未排序元素个数为0即可。稳定性:在选择排序中,每趟都会选出最大元素或最小元素,然后与两端元素交换,此时,待排

2021-11-10 10:52:59 306

原创 冒泡排序【必会知识】

冒泡排序冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大(小)的数下沉,较小(大)的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。时间复杂度平均是O(n^2),空间复杂度为 O(1)步骤也比较固定:1、比较相邻的元素。如果第一个比第二个大(小),就交换它们两个;2、在每一趟中,对于相邻的两个元素做着重复的操作,从第一对比较到最后一对,这样,总有一个最大(小)值在末尾;3、执行完步骤2后,最后一个元素是最大(小)的,下一趟不

2021-11-10 09:19:52 957 1

原创 Tomcat7.x、8.x、9.x、10.x 使用 Redis实现Session共享

我的环境:Tomcat 9.0.41jdk8如果只需要简单的实现session共享,并且存储时间默认为30分钟,可以如下操作即可实现,其他更加复杂的配置详情请看文章末尾小结。1、下载两个jar包放在tomca的lib目录下, 下载地址,翻到链接最底下即可2、编写 redisson.conf 放在tomcat根(${catalina.base})目录。{ "singleServerConfig":{ "password": 如果有就写,没有就删了, "addre

2021-07-05 23:16:33 499

原创 NIO三大核心:(缓冲区)Buffer、(通道)Channel、(选择器)Selector

缓冲区(Buffer)  一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。Java NIO 中的 Buffer 主要用于与 NIO 通道进行 交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。Buffer 类及其子类Buffer 就像一个数组,可以保存多个相同类型的数据。根 据数据类型不同 ,有以下 Buffer 常用子类:ByteBufferCharBufferShortBufferIntBufferLongBuffer

2021-07-02 21:46:25 528 1

原创 Java NIO 基本介绍与三大核心

Java NIO 基本介绍Java NIO(New IO)也有人称之为 java non-blocking IO,它是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,线程在读写IO期间不能干其他事情,比如调用socket.read()时,如

2021-07-02 15:30:08 415

原创 基于BIO形式下的文件传输

目标:支持任意类型文件形式的上传客户端实现public class Client { public static void main(String[] args) { try ( InputStream is = new FileInputStream("D:\\文件\\java.png"); ) { // 1、请求与服务端的Socket链接 Socket socket = ne.

2021-07-02 14:52:57 174

原创 BIO的伪异步编程

BIO的伪异步编程​  在BIO中:客户端的并发访问增加时。服务端将呈现1:1的线程开销,访问量越大,系统将发生线程栈溢出,线程创建失败,最终导致进程宕机或者僵死,从而不能对外提供服务。​  接下来我们采用一个伪异步I/O的通信框架,采用线程池和任务队列实现,当客户端接入时,将客户端的Socket封装成一个Task(该任务实现java.lang.Runnable线程任务接口)交给后端的线程池中进行处理。JDK的线程池维护一个消息队列和N个活跃的线程,对消息队列中Socket任务进行处理,由于线程池可以

2021-07-02 14:39:48 175 1

原创 Java I/O的3种模型简要说明

I/O 模型基本说明   I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:]BIO、NIO、AIO。实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的I/O模型I/O模型BIO  同步并阻塞(传统阻塞型),服务器实现模式为一个客户端连接一个线程,即客户端有连接请求时,服务端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 【简单示意图】NIO  同

2021-07-02 13:57:43 122

原创 支付宝沙箱支付(包括直接扫码支付)SpringBoot

准备工作1、登录支付宝开放平台:https://open.alipay.com/platform/developerIndex.htm2、点击研发服务:3、设置密匙由于我设置过了,里面有密匙,你们要点击那个支付宝密匙生成器,快捷链接:https://miniu.alipay.com/keytool/create点确定之后,就和我这个一样了好了,准备工作搞完了,页面先别关2、网页支付2.1 项目结构为了通俗易懂,我就省略了业务层和持久层,直接伪造数据,防止大家对有些方法疑惑。2

2021-06-26 21:34:13 1502 2

原创 Java实现加减乘除取模带括号的简单计算器功能

拿去即用/** * 计算 调用这个函数即可 * * @param expre 合法的算术表达式 * @return 返回一个String类型的结果 */@SuppressWarnings("all")public static String calculate(String expre) { List<String> num = null; Stack<Double> stack = null; num = transformEnd(expre);

2021-03-13 19:29:03 724

原创 Java 生成小学生100以内的四则运算加减乘除,不能出现小数和负数

此文针对3个数的加减乘除,没有括号,小数,负数运行示例import java.util.*;public class Student { public static String strTest = "";//存储表达式 public static Random random = new Random();//随机数 public static Scanner scanner = new Scanner(System.in);//输入 public stati

2021-03-13 19:25:56 1994

原创 策略模式初理解

策略模式在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,违背开闭原则。如

2021-02-21 15:55:43 304

原创 访问者模式初理解

访问者模式在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收

2021-02-21 15:55:31 393

原创 状态模式初理解

状态模式在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。如人都有高兴和伤心的时候,不同的情绪有不同的行为,当然外界也会影响其情绪变化。对这种有状态的对象编程,传统的解决方案是:将这些所有可能发生的情况全都考虑到,然后使用 if-else 或 switch-case 语句来做状态判断,再进行不同情况的处理。但是显然

2021-02-20 09:21:51 120

原创 观察者模式初理解

观察者模式在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用

2021-02-20 09:21:35 321

原创 备忘录模式初理解

备忘录模式每个人都有犯错误的时候,都希望有种“后悔药”能弥补自己的过失,让自己重新开始,但现实是残酷的。在计算机应用中,客户同样会常常犯错误,能否提供“后悔药”给他们呢?当然是可以的,而且是有必要的。这个功能由“备忘录模式”来实现。其实很多应用软件都提供了这项功能,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋

2021-02-20 09:21:18 144

原创 中介者模式初理解

中介者模式在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改,这叫作“牵一发而动全身”,非常复杂。如果把这种“网状结构”改为“星形结构”的话,将大大降低它们之间的“耦合性”,这时只要找一个“中介者”就可以了。如前面所说的“每个人必须记住所有朋友电话”的问题,只要在网上建立一个每个朋友都可以访问的“通信录”就解决了

2021-02-20 09:20:52 215

原创 迭代器模式初理解

迭代器模式在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全;增加了客户的负担。“迭代器模式”能较好地克服以上缺点,它在客户访问类与聚

2021-02-20 09:20:41 90

原创 命令模式初理解

命令模式在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。再比如,我们去餐厅吃饭,菜单不是

2021-02-20 09:20:17 106

原创 责任链模式

责任链模式在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有 Struts2 的拦截器

2021-02-20 09:20:05 150

原创 模板方法模式初理解

模板方法模式在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。这样的例子在生活中还有很多,例如,一个人每天会起

2021-02-20 09:19:48 132

原创 解释器模式初理解

解释器模式在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率要求不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的,本文将介绍其工作原理与使用方法。模式的定义与特点解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子

2021-02-20 09:19:29 125

原创 聊聊静态代理和动态代理

代理模式在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。代理模式的定义与特点代理模式的定义:由于某些原因需要给某对象提供一

2021-02-20 09:19:16 195

原创 享元模式初理解

享元模式在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。享元模式的定义与特点享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅

2021-02-19 20:53:08 80

原创 外观模式初理解

外观模式在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。下图给出了客户去当地房产局办理房产证过户要遇到的相关部门。外观模式的定义与特点外观

2021-02-19 20:52:21 117

原创 装饰模式初理解

装饰模式上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。装饰模式的定义与特点装饰(Deco

2021-02-19 20:51:16 110

原创 组合模式初理解

组合模式在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。组合模式的定义与特点组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部

2021-02-19 20:50:08 108

原创 桥接模式初理解

桥接模式在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。桥接模式的定义与特点桥接(Bridge)模式的定义如下:将抽象与

2021-02-19 20:48:01 204

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除