- 博客(286)
- 收藏
- 关注
原创 趣解设计模式之《小王的披萨店》
简单工厂简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。工厂方法模式定义了一个创建对象的接口(类或接口中的方法),但由子类决定要实例化的类是哪一个。工厂方法把实例化推迟到子类。当需要创建多种复杂类型的对象时,可以考虑使用工厂方法对对象进行归类。
2023-09-29 09:13:24
257
原创 趣解设计模式之《当代毕加索小王》
桥接模式将抽象部分和实现部分,分离解耦,使得两者可以独立地变化。桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立变化。桥接模式的优点1】将实现予以解耦,让它和应用之间不再永久绑定。2】抽象和实现可以独立扩展,不会影响到对方。3】对于“具体的抽象类”所做的改变,不会影响到客户。
2023-09-27 12:08:29
228
原创 趣解设计模式之《小王设计的疫苗管理平台系统》
享元模式/蝇量模式享元模式是池技术的重要实现方式,其定义如下:使用共享对象可以有效地支持大量的细粒度的对象。
2023-09-26 11:59:55
70
原创 趣解设计模式之《小王的糖果售卖机》
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式和策略模式的区别——意图是不同的状态模式】随着时间流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态。客户对其基本不了解。它是针对具有很多条件判断的替代方案。策略模式】客户通常主动指定context索要组合的策略对象是哪一个。它是继承之外的一种弹性替代方案。
2023-09-23 21:45:33
343
原创 趣解设计模式之《小王与他的Apple商店》
访问者模式表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。根据上面的小故事,我们可以看到小王的主要困扰就是针对不同的用户类型要有不同的折扣,这样随着用户类型的增多或者减少,我们都要频繁的修改电脑组件类(CPUMemory)里的if-else价格判断逻辑。那我们来思考一下,哪些是变化的?哪些是不变的呢?变化普通用户学生用户企业采购用户……不变CPUMemory……既然变化的是用户类型,那么我们何不。
2023-09-22 13:16:40
65
原创 趣解设计模式之《珍爱生命,远离只狼》
备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。当你需要让对象返回之前的状态时(例如:你的用户请求“撤销”),就使用备忘录模式。
2023-09-21 12:47:02
93
原创 趣解设计模式之《庞大的组织架构带来的烦恼》
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
2023-09-20 12:17:57
85
原创 趣解设计模式之《会飞的橡皮鸭》
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。这里面的核心思想就是,将变化的行为抽取出来,然后采用组合的方式而非继承的方式来为目标类增加所需能力。以上面的故事为例,我们可以将fly行为、quack行为等抽取出来,分别定义为接口。然后,通过实现FlyBehavior接口或QuackBehavior接口来丰富具体飞行与叫声行为(即:算法族),然后在具体的鸭子实现类中,引入不同的飞行和叫声的子类实现,从而实现行为的多样性。
2023-09-19 13:20:24
142
1
原创 趣解设计模式之《小王的学习秘籍》
原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。也就是说,这种不通过new关键字来产生一个对象,而是通过对象复制(Java中的clone或反序列化)来实现的模式,就叫做原型模式。
2023-09-18 14:12:00
190
原创 趣解设计模式之《同学们,交作业啦!》
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。这里我们也可以采用拉的方式,因为推的方式,可能会推过来一堆我不需要的信息。那么,当有通知过来,我收到了,我自己再去拉我自己需要的内容。而不是采用你给我什么,我就接收什么。任何时候,我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。
2023-09-15 15:58:55
74
原创 趣解设计模式之《把意大利炮给我拿来!》
命令模式将“请求”封装成命令对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。为了加深模式的理解,我们假设要设计一款多功能遥控器,这个遥控器有一排的on开关和一排的off开关,我们可以指定某个on/off开关执行某个命令,比如开灯、关灯、打开电视等等。
2023-09-14 00:28:51
91
原创 趣解设计原则之《我买了宝马,为啥不让我停这?》
通过上面的例子,我们可以看到小王遇到的问题就是,自己的车标不是宝马车标,所以不符合宝马公司允许停车的标准了。那么,我们可以这样认为:宝马汽车】是父类,它有一个方法是getLogo(),这个方法会返回BMW;3系、X3、5系、7系……】是子类,继承了父类的getLogo(),调用后也会返回BMW;所以宝马公司就有理由决定,只要调用getLogo()方法且返回“BMW”的车子,都可以被认为是宝马汽车,那么自然而然可以通过这个条件,来限制哪些车辆可以免费停到BMW的专属车位了。而小王自己把方法。
2023-09-12 10:32:38
105
原创 趣解设计原则之《只是买台咖啡机,竟然要学习咖啡器的运行原理?》
该模式将一个类的接口,转换成客户期望的另一个接口。适配器模式让原本接口不兼容的类可以合作无间。此时我们维护了一个员工管理系统,然后接入我们系统的第三方系统,我们都要求对方遵守我们的接口规范去开发,比如:提供方法名为的方法等等。但是,这次接入的系统已经有类似功能了,他们不希望因为两个系统的接入而重新开发新的接口,那么这对这种情况,我们就可以采用适配器模式,将接口做中间层的适配转换。
2023-09-12 10:20:56
415
原创 趣解设计模式之《怀念小时候玩的红白机嘛?》
模版方法在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。为了便于大家对以上定义的理解,我们还是以玩FC游戏机为例,看一看哪些部分是“算法骨架”,哪些部分属于“延迟到子类实现。
2023-09-12 10:19:23
94
原创 趣解设计模式之《为什么租房子要找中介?》
中介者模式使用中介者模式来集中相关对象之间复杂的沟通和控制方式。为了便于理解,我们再举一个系统设计上的例子。在网上售卖商城的系统中,存在三个功能,分别为采购功能销售功能和库存功能。采购功能】需要从销售功能获取到销售情况,并且确定是否要继续采购增加库存量。销售功能】要获得库存信息,并且销售量大于库存量,则需要通知采购功能快速采购商品。并且每当销售了产品后,需要扣减库存。库存功能】如果库存压力大了,要提示销售功能去折价促销,尽快消耗库存,并且通知采购功能暂时不要进行该商品的采购行为。
2023-09-12 10:13:46
64
原创 趣解设计模式之《办理入职这么难吗?》
门面模式/外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
2023-09-10 12:51:16
86
原创 趣解设计原则之《做个Rapper咋这么难?》
接口隔离原则(ISP使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。建立单一接口,不要建立臃肿庞大的接口。接口尽量细化,同时接口中的方法尽量少。单一职责原则和接口隔离的区别?答:它们的审视角度不同。单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分。接口隔离原则要求接口的方法尽量少。具体来说,实现接口隔离原则需要关注以下3点:接口要尽量小】不要违反单一职责原则,要适度的小,要适度。接口要高内聚】提高接口、类、模块的处理能力,减少对外的交互。
2023-09-09 19:09:15
154
原创 十分钟,了解Kafka的Sender线程
当我们发送消息的时候,消息发送到哪个分区,这个分区对应的Broker的地址和端口,已经这个是否配置了Kafka集群,集群中都包含哪些节点等等,都是保存在元数据信息中的。那么,
2023-09-08 18:10:36
141
原创 一文了解Kafka的消息收集器RecordAccumulate
在上一篇文章《》中,我们介绍了。在介绍原理之前,大家再重温一下Producer端的整体架构,图示如下所示:这个图看不懂没有关系,我们会在介绍Producer端原理时一一介绍每个部分的含义及其所复杂的功能。
2023-09-06 10:18:02
101
原创 连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
在介绍原理之前,大家先对其整体架构有一个大致的了解,图示如下所示:这个图看不懂没有关系,我们会在介绍Producer端原理时一一介绍每个部分的含义及其所复杂的功能。
2023-09-05 10:24:43
89
原创 趣解设计原则之《我发誓!再也不买一体机了》
从上面的小故事,我们可以看到,小王没法玩这款游戏的主要原因就是显卡配置太低了,由于一体机对于硬件升级的“开闭原则“很不友好,所以,只能通过更换电脑这种高昂的代价还满足用户的需求了。而对于普通的电脑来说,显卡不行升级显卡就可以了;主板不行升级主板;硬盘不行升级硬盘……,我们发现,对于不同的需求,只需要进行小范围的调整,而不至于去更换整台电脑。那么,这就满足了我们即将要介绍的开闭原则了。下面,我们来看一下这个设计原则的定义:针对类、方法、模块应该对扩展开放,对修改关闭。
2023-09-01 12:57:34
100
原创 趣解设计模式之《买了苹果笔记本的尴尬》
该模式将一个类的接口,转换成客户期望的另一个接口。适配器模式让原本接口不兼容的类可以合作无间。此时我们维护了一个员工管理系统,然后接入我们系统的第三方系统,我们都要求对方遵守我们的接口规范去开发,比如:提供方法名为的方法等等。但是,这次接入的系统已经有类似功能了,他们不希望因为两个系统的接入而重新开发新的接口,那么这对这种情况,我们就可以采用适配器模式,将接口做中间层的适配转换。
2023-08-31 15:22:17
69
原创 趣解设计模式之《离婚律师》
代理模式为另一个对象提供一个替身或占位符,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。在SpringAOP中采用的JDK动态代理,就是最典型的例子。当我们想要对一个业务类进行某些横切性的增强时,例如:增加请求与响应的日志、增加权限校验、增加远程请求对象封装等等。我们可以采用代理模式去实现,而不需要修改原有的类。
2023-08-31 11:56:32
102
原创 看个电影就能学会类的加载过程?我不信!
今天我们来了解一下关于类的加载过程,这个问题在面试过程中属于高频面试题了。那么回答的时候,我们往往会采取死记硬背的方式,告诉面试官类的加载过程包括:、、、和这5个阶段。但是如果面试官继续问到,这5个步骤都具体做什么呢? 我们就回答不上来了。那么今天,我们就通过和好朋友们一起去看电影的例子,来再次理解类的加载过程。今天是一个阳光明媚的周末,你和几个关系很好的同事们一同相约去看《变形金刚》这部电影,由于这部电影上市以来异常火爆,所以电影院外面就挤满了人,为了保持安全和观影顺序,工作人员把大家安排成一排排的队列,
2023-08-25 10:08:56
77
原创 只需五分钟,了解kafka的环境搭建
在Kafka系列的上一篇文章中,我们介绍了Kafka的体系结构,那么本篇文章呢,。此处 ,我们采用线上环境普遍使用的ZooKeeper作为管理存储和管理kafka集群元数据,或者辅助Controller选举操作等。那么,在管理界面的展示端,我们采用了EFAK(即:kafka-eagle),所以这部分的安装步骤,我们也会在下文中展示出来。
2023-08-24 11:21:22
111
原创 初识kafka,先了解这些就够了
MQ作为消息中间件,对于我们来说,已经并不陌生了,那么,由于Kafka它在众多的MQ间是非常火热的,那么必然也是我们需要着重关注的中间件之一了,为了更加清晰的了解Kafka,我们先从入手,看看大体上都包含哪些东西。具体请见下图所示:image.png其中有一些我们很熟悉的,比如:Producer、Consumer;当然,也有一些陌生的概念,例如:Broker,下面我们就一一说明一下:】消费者,即:向Kafka中发送消息的消息生产端;
2023-08-23 16:20:50
55
原创 趣解设计原则之《论一个小老板的发家史》
通过上面的一个故事,大家可以看到,从之前一个员工要负责和面制馅包馅成型烘焙这一系列流程操作,到后来只负责其中的一件事,这其实就是单一职责原则了。除了可以提高生产力之外,还有一个非常重要的点就是——可替换性;我们假设其中有某位工人要离职不干了,那么他之前是负责包馅的,我们只需要再培训一个包馅的员工补充上去即可。而如果是一个全流程都要负责的员工离职了,这个培训和替换的代价就非常大了。其实在我们开发和架构上,也是这样的。从之前的单体架构,再到现在的微服务架构,我们会发现,
2023-08-22 12:04:54
116
原创 (一)Dubbo源码解析:增强SPI
在Dubbo的架构设计中,如何可以通过“类插拔”的方式,对其功能进行灵活的扩展或者削弱,那么,SPI起到了极其关键的作用。本篇文章作为分析Dubbo源码的第一篇文章,我们先暂时放下“服务注册发布流程”、“服务启动流程”、“请求处理流程”……,只有搞懂了这个问题,我们后续再看其他功能代码的时候,才会更加游刃有余、畅快无阻~
2023-08-21 14:42:08
70
原创 只需5分钟,了解常见的四种限流算法
在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期时。如图所示,我们要求3秒内的请求不要超过150次:但是,貌似看似很“完美”的流量统计方式其实存在一个非常严重的,即:如果第2到3秒内产生了150次请求,而第3到4秒内产生了150次请求,那么其实在第2秒到第4秒这两秒内,就已经发生了300次请求了,远远大于我们要求的。
2023-08-20 18:52:14
113
原创 双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?
我们要获得一个类的Class实例,可以采用如下方式:那么在Class的方法中,,然后,再通过类加载器来负责对类进行加载操作。,就可以通过如下的方法对执行类加载操作的。那么在如下的代码逻辑中,可以看到双亲委派机制的逻辑了。也就是说,。那么,为什么父类加载器无法加载某个类呢?原因就是,每个类型的加载器z都有其约束的,如果这个className没有在这个路径下,那么对应的类加载器就无法加载这个类了。
2023-08-19 15:43:09
158
原创 趣解设计原则之《我国出租车行业的发展伪历史》
根据上面的故事,我们可以发现,我们最初的出租车强制要求是大众的桑塔纳了,那么就是我们常说的:依赖了具体的实例而后面,我们针对出租车总结出了N条特征,那么这个就是我们常说的:接口我们针对出租车的N条特征来全球征集符合特征的车辆,这些车辆都有机会成为出租车,那么就是我们常说的:基于接口开发好咧~ 故事就讲到这里了,今天你学会(fei)了嘛~ 期待我们下期再见~今天的文章内容就这些了:写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的分享。更多技术干货,欢迎大家关注公众号“
2023-08-18 12:36:44
86
原创 忘记LockSupport怎么用了?那我们举个有趣的小例子,永远记住它!
LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。和相比,它弥补了由于resume()在前发生,导致线程无法继续执行的情况。和方法相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常。park()可以阻塞当前线程,其中每一个线程都有一个许可,该许可默认为[不可用]。如果该许可是[可用]状态,那么park()方法会立即返回,消费这个许可,将该许可变更为[不可用]状态,流程代码可以继续执行。如果该许可是[不可用]状态,那么。
2023-08-17 17:31:37
65
原创 (七)Spring源码解析:Spring事务
当我们希望在Spring中开启事务的时候,我们需要在配置中增加,如下所示:file我们在Spring项目中搜索“”,可以发现与事务相关的处理类为,在该类中,注册了解析器,代码如下所示:file在类中我们需要关注的就是parse(...)方法,它负责执行BeanDefiniton的解析操作。这里会通过mode属性来确定是采用aspectj的方式进行解析还是采用AOP代理的方式进行解析,具体逻辑如下所示:file由于常用的就是采用AOP代理的方式进行解析操作,所以此处我们只需要关心类的。
2023-07-17 23:50:39
401
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人