设计模式就该这样学
文章平均质量分 84
设计模式就该这样学
Tom弹架构
咕泡教育联合创始人、Java架构师丛书作者
展开
-
Java经典面试题:Spring中用到了哪些设计模式?
因为Bean的实例化包含原生对象的实例化,和代理对象的实例化,不同对象实例化的逻辑也不一样,所以实例化策略也不一样,比如SimpleInstantiationStrategy就是Spring中默认的实例化策略。当然,Spring是一个非常经典的框架,它用的的设计模式也非常多。主要用于当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知,在Spring中一般以Listener结尾,比如ApplicationListener等等。在Spring,只要是以Adapter命名的类基本都是适配器模式的应用。原创 2022-09-21 10:08:18 · 1034 阅读 · 0 评论 -
国内一二线互联网公司必问题:什么是双亲委派机制?
扫码左侧二维码拿完整版面试文档资料!今天给大家分享一道国内的一二线互联网公司,高频次出现的面试题。比如,什么是类加载?什么是双亲委派? 等等。首先,我们来看双亲委派,它全称是Parent Delegation Model,直译过来可能叫做父级委托模型更容易理解。不管它叫什么,如果是你被问到这样的问题,你会不会冷场呢?那么,今天我给大家分享一下我的理解。我花了1个多星期把往期的面试题解析配套文档准备好了,一共有10W字,想获取的小伙伴可以从我的个人煮叶简介中找到。要理解双亲委派,首先要理解Java的类加载机制原创 2022-06-06 15:53:30 · 647 阅读 · 0 评论 -
什么时候需要做读写分离?
完整版PDF面试文档扫描左侧二维码拿!很多小伙伴可能会认为数据库的负载问题就应该使用“读写分离”来解决。这其实是一个非常大的误区,我们要使用“读写分离”,首先要搞明白“读写分离”能解决什么问题,而不仅仅只会使用这个技术。1、什么是读写分离?读写分离就是将数据库分为主数据库和从数据库,主库用来接收数据写入的操作,多个从库用来接收读数据的操作,主库将写入的数据通过一些机制实时同步到从库,比如Binlog等等。2、读写分离解决什么问题?大多数互联网公司的业务场景,往往都是读多写少原创 2022-05-31 14:37:18 · 1108 阅读 · 1 评论 -
这样调试正则表达式,开发效率提升80%
【Java面试】14年开发压箱底干货分享,这样调试正则表达式,开发效率提升80%我们在日常的Java开发中,经常需要处理一些字符串,如果使用正则表达式就能大大提升开发效率。几乎在所有的编程语言中都支持正则表达式。以下我将压箱底多年的干货搬出来给大家参考,都是我们日常使用频次比较高的正则表达式。另外,我还分享了很多面试题,想学习的可以在我的煮叶简介中找到。1、案例分析先来看一个常用的案例,如果要验证一个url的格式是否正确,要慢满足这几个条件:1、必须以http或者https开头原创 2022-06-03 12:00:00 · 563 阅读 · 0 评论 -
什么场景要使用策略模式,什么场景不能使用?
需完整版面试文档扫描左侧二维码拿!滴,老年卡;滴,学生卡;滴正常卡。我们在坐公交车的时候啊,这个场景每天都在上演。那如果,让你来设计这样一套刷卡的结算逻辑,你最先想到的是用什么设计模式呢?如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。1、官方定义官方原文是:Define a family of algor原创 2022-06-02 12:15:00 · 935 阅读 · 0 评论 -
什么场景要使用单例模式,什么场景不能使用?
今天我跟大家分享一下,什么场经常有小伙伴问我,设计模式学了这么久,每次看到概念也都能理解。但是,就是不知道怎么用,在哪里能用?我告诉大家,设计模式,不是为了要用而用的,而是作为前人总结下来的经验,等到哪天需要用的时候,你能想起来为你所用。今天我跟大家分享一下,什么场景下需要用单例模式,什么场景下不应该用单例模式?回答这个问题之前,我得先问小伙伴们一个问题。你觉得一家公司能有两个CEO吗?如果有两个CEO,请问谁做决策,员工应该听谁的?所以,在这种情况下,很显然公司的CEO只能是单例。...原创 2022-06-01 12:15:00 · 2423 阅读 · 0 评论 -
为什么MySQL索引结构采用B+树?
一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么MySQL索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希望听听我的见解。另外,我花了1个多星期把往期的面试题解析配套文档准备好了,一共有10万字,想获取的小伙伴可以在我的煮叶简介中找到。1、B树和B+树一般来说,数据库的存储引擎都是采用B树或者B+树来实现索引的存储。首先来看B树,如图所示。B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二原创 2022-05-28 14:59:36 · 1409 阅读 · 0 评论 -
十余年从业经验告诉你,Dubbo和SpringCloud的优缺点对比
完整版PDF面试文档扫描左侧二维码免费领取!其实我个人不太愿意,拿Dubbo和Spring Cloud进行对比,因为它俩最初出现并不是为了解决同一类问题。但是,国内技术是在太卷,加上微服务的盛行,很多互联网大厂也经常会问到这个问题。那么今天,我还是给大家来详细聊一聊。另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。1、两者对比关于Dubbo和Spring Cloud的优缺点,我以奈菲(Netflix)版本为例,从以下5个方面来分原创 2022-05-27 10:29:46 · 953 阅读 · 1 评论 -
一文教你,synchronized和Lock的区别?
需要完整版面试文档扫描左侧二维码领取!最近有多位粉丝被问到synchronized和Lock,据说还是阿里一面的面试题。在分布式开发中,锁是控制线程的重要方式。Java提供了两种锁机制synchronized 和 Lock。接下来,我给大家分享一下我对synchronized和Lock的理解。另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以扫描左侧二维码领取!1、两者对比synchronized和Lock都是Java中用来解决线程安全问题的一个工具,那么原创 2022-05-26 15:16:34 · 1575 阅读 · 0 评论 -
为什么Netty线程池默认大小为CPU核数的2倍
需要面试文档可用V扫描左侧二维码领取完整版有位工作5年的小伙伴问我说,为什么Netty线程池默认大小为CPU核数的2倍,今天,我花2分钟时间给大家专门分享一下我对这个问题的理解。另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。1、分析原因我们都知道使用多线程的本质是为了提升程序的性能,总体来说有两个最核心的指标,一个延迟,一个吞吐量。延迟指的是发出请求到收到响应的时间,吞吐量指的是。这两个指标之间有一定的关联,因为同等条件下延迟越短吞.原创 2022-05-23 15:38:34 · 2088 阅读 · 0 评论 -
Spring中@Autowired和@Resource的区别
最近有非常多的小伙伴从大厂毕业了,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。好了,先来看@Autowired这个注解。1、@Autowired注解@Autowired这个注解呢,是由Spring提供的...原创 2022-05-19 17:45:00 · 1163 阅读 · 0 评论 -
什么是Redis缓存雪崩、缓存穿透和缓存击穿?
需要面试文档可S我什么是Redis缓存雪崩、缓存穿透、缓存击穿?关于这个问题至少有20位以上的粉丝咨询过我。这确实是一道互联网大厂的高频面试题。今天,我给大家来聊一聊。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。好了,首先来说一下,缓存的作用。1.缓存的作用一般情况下,1.用户请求到后台,会先从缓存中取数据,如果在缓存中取到数据,就直接返回结果,如果取不到数据就需要查询数据库,从数据库中取数据,从数据库中取到数据后会同步更新到缓存,并返回结果原创 2022-05-12 19:42:15 · 463 阅读 · 0 评论 -
Redis是单线程还是多线程,为什么效率这么高?
Redis是单线程还是多线程?这个问题,把一个5年开发经验的程序员给问懵了。可能很多小伙伴平时都听说过,Redis就是单线程的。但是我们学习Redis命令的时候,有经常有设置异步,比如bgsave命令,它的作用是在后台异步持久化数据到磁盘,那既然是异步,肯定需要由线程来完成。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。接下来,我们来介绍,Redis到底是单线程还是多线程?。1、官方解释其实,Redis确实是单线程的。通常说的单线程,主要是指Re...原创 2022-05-11 14:00:51 · 2890 阅读 · 0 评论 -
Spring到底学到什么程度才算学会?
面试造火箭,工作拧螺丝。今天有位工作5年的小伙伴私我说,Spring到底要学到什么程度才算学会?你可能会这样回答:能手写Spring会用还会讲出来能看源码了解原理能知其所以然,知道为何要这样设计了解设计模式在Spring中的应用能画出主要流程图能快速定位问题,解决问题了解各种主要的特性会熟练使用小伙伴们也可以思考一下,在评论告诉我的你看法.1、Tom的经验分享今天,我给大家聊聊我的看法。我认为要回答这个问题,要根据每个人的工作...原创 2022-05-10 14:53:44 · 544 阅读 · 0 评论 -
3分钟通晓,互联网架构20年以来的演进
作为一个Java程序员,你可能也思考过,为什么我还是普通开发,为什么我还是高级开发,普通开发和高级开发有什么区别?你是不是也想过要成为架构师?想要成为合格的架构师,就必须要了解架构的演进,今天,我们就来聊一聊,Java架构的演变历史。1、分布式微服务架构的演进分布式微服务架构的发展,主要经历了四个阶段:单一应用架构、垂直应用架构、分布式架构和弹性SOA架构。这张图是从Dubbo官网上下载的描述分布式架构演进过程的示意图,大家可以收藏一下。1)单体架构(AllinOn...原创 2022-05-09 16:09:53 · 1582 阅读 · 0 评论 -
Spring到底学到什么程度才算学会?
面试造火箭,工作拧螺丝。今天有位工作5年的小伙伴私我说,Spring到底要学到什么程度才算学会?你可能会这样回答:能手写Spring会用还会讲出来能看源码了解原理能知其所以然,知道为何要这样设计了解设计模式在Spring中的应用能画出主要流程图能快速定位问题,解决问题了解各种主要的特性会熟练使用小伙伴们也可以思考一下,在评论告诉我的你看法.1、Tom的经验分享今天,我给大家聊聊我的看法。我认为要回答这个问题,要根据每个人的工作...原创 2022-05-08 15:09:01 · 2069 阅读 · 0 评论 -
美团面试真题,如何保证Kafka消息不丢失?
【Java面试】‘如何保证Kafka消息不丢失?’,只会回答,消息要持久化?添加信息确认机制?今天带你彻底搞明白一位工作了5年的小伙伴去美团面试以后,跟我反馈说,被问到一个“如何保证Kafka消息不丢失?”的问题,不知道如何回答。其实,这道题真的很基础。很多小伙伴可能只会回答说,消息要持久化,添加消息确认机制。如果,你只是这样回答,那就和普通的程序员没什么区别。要想让面试官感觉你确实有不一样的理解,就应该从多个方面更全面地来分析和回答这个问题。今天,我来给大家讲明白。【导航条:解决思路原创 2022-05-07 18:15:00 · 530 阅读 · 0 评论 -
最通俗的方式理解Spring循环依赖三级缓存
今天,有位粉丝找我,说要耽误我5分钟时间,想让我帮助它理解一下Spring循环依赖的三级缓存,绕晕了一个星期,没有想明白。我想今天,用最通俗易懂的方式给大家重新梳理一下,保证让你听懂了。1、什么是循环依赖?循环依赖就是指循环引用,是两个或多个Bean相互之间的持有对方的引用。循环依赖有三种形态:1、相互依赖,也就是A依赖B,B又依赖A,它们之间形成了循环依赖。2、三者间依赖,也就是A依赖B,B依赖C,C又依赖A,形成了循环依赖。...原创 2022-05-06 18:00:00 · 652 阅读 · 0 评论 -
为什么越来越多的人选择Spring Boot?
需要面试文档可S我我们都知道,Spring是一个非常经典的应用框架,与其说是Java开发不如说是Spring开发,为什么现在越来越多的人会选择用SpringBoot呢?。要回答这个问题,还需要从JavaWeb开发的发展历史开始说起。1、JavaWeb开发简史自1995年JamesGosling(詹姆斯·高斯林)带领团队设计发布Java语言以来,Java一直排在编程语言排行榜的前列,JamesGosling也被称为“Java之父”。在最初发布的Java版本中...原创 2022-05-05 16:48:04 · 680 阅读 · 0 评论 -
Spring Boot自动装配原理
需要面试文档的扫描下方二维码昨天,有位在广州工作4年的小伙伴,在面试中被问到SpringBoot自动装配原理,当时,自我感觉比较好,他要的是30K,但是都没有拿到Offer。今天,我给大家分享一下我的理解。1、SpringBoot自动装配是什么?SpringBoot自动装配主要是基于注解编程和约定优于配置的思想来设计的。自动装配就是由Spring自动把其他组件中的Bean装载到IoC容器中,不需要开发人员再去配置文件中添加大量的配置。我们只需要在Spring...原创 2022-05-02 17:30:00 · 559 阅读 · 0 评论 -
哪些情况下的单例对象可能会破坏?
【Java面试】一道简单又不简单的面试题,哪种情况下的单例对象可能会被破坏?昨天,有位小伙伴在评论区留言,希望我分享一些设计模式相关的面试题。设计模式本身是很抽象的,但是在很多面试中又经常被问到,很多小伙伴其实都能答得上,但是又不知道怎么样回答才能让面试官满意,往往越简单的知识越能够体现出核心竞争力。今天,我给大家分享一个简单又不简单的单例模式,希望能够帮助到大家。先来看单例模式的定义。1、单例模式的定义关于单例模式的定义,官方原文是这样描述的:Ensurea.原创 2022-05-03 12:45:00 · 720 阅读 · 0 评论 -
ThreadLocal真的会造成内存泄漏吗?
【Java面试】并发场景中,ThreadLocal会造成内存泄漏吗?ThreadLoca在并发场景中,应用非常多。前几天有位小伙伴问我一个问题,说ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考。如果大家有其他见解可以在评论区讨论。【导航条:基本原理】(转场,屏幕黑底白字,正中央出现“1ThreadLocal的基本原理”)1、ThreadLocal的基本原理考虑到很多小伙伴可能还不太了解ThreadLocal,我先简单介绍一下Th..原创 2022-05-01 17:45:00 · 1405 阅读 · 4 评论 -
为什么ConcurrentHashMap不允许插入null值?
需要面试文档的扫描下方二维码在Java语言中,给ConcurrentHashMap和Hashtable这些线程安全的集合中的Key或者Value插入null(空)值的会报空指针异常,但是单线程操作的HashMap又允许Key或者Value插入null(空)值。这到底是为什么呢?1、探寻源码为了找到原因,我们先来看这样一段源码片段,打开ConcurrentHashMap的putVal()方法,源码中第一句就非常明确地做了判断,如果Key或者...原创 2022-04-30 17:45:00 · 4387 阅读 · 0 评论 -
ConcurrentHashMap是如何保证线程安全的?
ConcurrentHashMap相当于是HashMap的多线程版本,它的功能本质上和HashMap没什么区别。因为HashMap在并发操作的时候会出现各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用ConcurrentHashMap就可以完美地解决。那问题来到了,ConcurrentHashMap它是如何保证线程安全的呢?1、JDK1.7实现原理首先,我们来看JDK1.7中ConcurrentHashMap的底层结构,它基本延续了HashMap的设计,采用的是数组加链...原创 2022-04-29 17:30:00 · 15679 阅读 · 7 评论 -
为什么HashMap会产生死循环?
HashMap死循环是一个比较常见、也是比较经典的面试题,在大厂的面试中也经常被问到。HashMap的死循环问题只在JDK1.7版本中会出现,主要是HashMap自身的工作机制,再加上并发操作,从而导致出现死循环。JDK1.8以后,官方彻底解决了这个问题。1、数据插入原理在分析原因之前,我先带大家了解一下JDK1.7中HashMap插入数据的原理,来看动画演示:由于JDK1.7中HashMap的底层存储结构采用的是数组加链表的方式。而HashM...原创 2022-04-28 18:00:00 · 9938 阅读 · 12 评论 -
请简述Spring MVC的执行流程
今天我给大家介绍一下SpringMVC的详细执行流程。我把SpringMVC的执行流程划分为三个阶段,配置阶段、初始化阶段和运行阶段。我整理了一张完整的执行流程图,需要高清图的小伙伴可以私信我。下面详细介绍每个阶段的执行细节。1、第一阶段:配置阶段配置阶段,主要是完成对xml配置和注解配置。具体步骤如下:首先,从web.xml开始,配置DispatcherServlet的url匹配规则和Spring主配置文件的加载路径然...原创 2022-04-27 18:45:00 · 4559 阅读 · 0 评论 -
刚折腾完Log4J,又爆Spring RCE核弹级漏洞
继Log4J爆出安全漏洞之后,又在深夜,Spring的github上又更新了一条可能造成RCE(远程命令执行漏洞)的问题代码,随即在国内的安全圈炸开了锅。有安全专家建议升级到JDK9以上,有些专家又建议回滚到JDK7以下,一时间小伙伴们不知道该怎么办了。大家来看一段动画演示,怎么改都是“将军"。大家不要慌,我给大家先临时支个招,后面再出教程。首先叫大家怎么排查哪些项目存在风险,然后,再介绍修复方案。1、第一步:排查方法排查的主要目的是确定你的项目是否使用了Spring框架。当然,你的..原创 2022-04-26 12:06:51 · 419 阅读 · 0 评论 -
两个Integer对象比较大小,为什么100等于100,1000不等于1000 ?
前几天,有位小伙伴向我反馈,在维护代码过程中,出现了一个莫名其妙的问题。明明上线之后程序跑得还好好的,可程序上线运行一段时间之后,所有,代码没有做任何修改,发 cxccccc现运行结果和期望值恰好相反。因为涉及到金额造成了比较大的损失,最后,这位小伙伴还被公司辞退了,大家可以来评论一下,这位小伙伴背的这个锅值不值?1、业务场景大家来看,他的代码大致是这样写的:一般情况下,a和b都输入100的时候,返回为true,但当a和b都输入1000的时候,返回为false。按照正常逻辑理解,100原创 2022-04-26 18:00:00 · 1328 阅读 · 0 评论 -
什么条件下会产出死锁,如何避免死锁?
一个去美团面试的小伙伴私我说,被面试官问到一个死锁的问题难道了,面试前还特意刷了题,面试的时候就是脑子一片空白不知道怎么回答。今天,我给大家彻底讲明白。1、什么是死锁?到底什么是死锁呢?什么条件下会产出死锁,如何避免死锁?死锁,简单来说就是两个或者两个以上的线程在执行过程中,去争夺同一个共享资源导致相互等待的现象。如果没有外部干预,线程会一直处于阻塞状态,无法往下执行。这样一直等待处于阻塞状态的线程,被称为死锁线程。2、产生死锁的原因产生死锁需要同时满足以下四个条件:什么条件下会产出死锁,原创 2022-04-25 15:46:28 · 1068 阅读 · 0 评论 -
什么是内存溢出,什么是内存泄漏?
什么是内存溢出,什么是内存泄漏?这是很多小伙伴经常问我的一个问题,今天花3分钟时间给大家介绍一下。先来介绍什么是内存溢出?1、什么是内存溢出?发生内存溢出。我们来看到右侧的区域,假设我们JVM中可用的内存空间只剩下3M,但是我们要创建一个5M的对象,那么,新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好比是一个容量只有300ml的水杯,我们硬要往里面倒500ml的水,这时候,水就会溢出,倒不进去了,这就相当于是内存的溢出。那么,内存泄漏又是怎么回事呢?2、什么是内存泄漏?还是来看这张原创 2022-04-24 17:08:52 · 3059 阅读 · 0 评论 -
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
本文所有内容均节选自《设计模式就该这样学》序言Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复.原创 2021-11-26 14:00:01 · 3724 阅读 · 2 评论 -
对象池模式(Object Pool Pattern)
本文节选自《设计模式就该这样学》1 对象池模式的定义对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,减少频繁创建对象所占用的内存空间和初始化时间。一个对象池包含一组已经初始化并且可以使用的对象,可以在有需求时创建和销毁对象。对象池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁。对象池是一个特殊的工厂对象,对象池模式就是单例模式加享元模式。2 对象池模式的应.原创 2021-11-25 18:52:11 · 708 阅读 · 2 评论 -
规格模式(Specification Pattern)
本文节选自《设计模式就该这样学》1 规格模式的定义规格模式(Specification Pattern)可以认为是组合模式的一种扩展。很多时候程序中的某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。这里的每个条件都是一个规格,多个规格(条件)通过串联的方式以某种逻辑关系形成一个组合式的规格。规格.原创 2021-11-25 19:00:11 · 627 阅读 · 0 评论 -
空对象模式(Null Object Pattern)
本文节选自《设计模式就该这样学》1 空对象模式的定义空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。原文:Provide an object as a surrogate for the lack of an object of a .原创 2021-11-25 19:01:22 · 642 阅读 · 0 评论 -
雇工模式(Employee Pattern)
本文节选自《设计模式就该这样学》1 雇工模式的定义雇工模式(Employee Pattern)也叫作仆人模式(Servant Pattern),属于行为型设计模式,它为一组类提供通用的功能,而不需要类实现这些功能,也是命令模式的一种扩展。2 雇工模式的应用场景在日常开发过程中,我们可能已经接触过雇工模式,只是没有把它抽取出来,也没有汇编成册。或许大家已经看出这与命令模式非常相似,其实雇工模式是命令模式的一种简化,但更符合实际需要,更容易进入开发场景中。3 雇工模式的UML类图雇工模式的UML.原创 2021-11-25 19:02:04 · 716 阅读 · 0 评论 -
彻底搞懂访问者模式的静态、动态和伪动态分派
本文节选自《设计模式就该这样学》1 使用访问者模式实现KPI考核的场景每到年底,管理层就要开始评定员工一年的工作绩效,员工分为工程师和经理;管理层有CEO和CTO。那么CTO关注工程师的代码量、经理的新产品数量;CEO关注工程师的KPI、经理的KPI及新产品数量。由于CEO和CTO对于不同的员工的关注点是不一样的,这就需要对不同的员工类型进行不同的处理。此时,访问者模式可以派上用场了,来看代码。//员工基类public abstract class Employee { publi.原创 2021-11-24 15:08:41 · 558 阅读 · 0 评论 -
微信和QQ这么多群,该如何管理好友关系?
本文节选自《设计模式就该这样学》1 中介者模式的应用场景在现实生活中,中介者的存在是不可缺少的,如果没有了中介者,我们就不能与远方的朋友进行交流。各个同事对象将会相互进行引用,如果每个对象都与多个对象进行交互,则会形成如下图所示的网状结构。从上图可以看到,每个对象之间都过度耦合,这样既不利于信息的复用也不利于扩展。如果引入中介者模式,则对象之间的关系将变成星形结构,如下图所示。从上图可以看到,使用中介者模式后,任何一个类的变化,只会影响中介者和类本身,不像之前的设计,任何一个类的变化都会引..原创 2021-11-24 13:41:11 · 550 阅读 · 0 评论 -
使用命令模式重构播放器控制条
本文节选自《设计模式就该这样学》1 命令模式的UML类图命令模式的UML类图如下图所示。2 使用命令模式重构播放器控制条假如我们开发一个播放器,播放器有播放功能、拖动进度条功能、停止播放功能、暂停功能,我们在操作播放器的时候并不是直接调用播放器的方法,而是通过一个控制条去传达指令给播放器内核,具体传达什么指令,会被封装为一个个按钮。那么每个按钮就相当于对一条命令的封装。用控制条实现了用户发送指令与播放器内核接收指令的解耦。下面来看代码,首先创建播放器内核GPlayer类。public cl.原创 2021-11-22 16:51:39 · 690 阅读 · 0 评论 -
只要100行代码,实现文本编辑器中的草稿箱功能
本文节选自《设计模式就该这样学》1 使用备忘录模式实现草稿箱功能大家都用过网页中的富文本编辑器,编辑器通常都会附带草稿箱、撤销等操作。下面用一段代码来实现一个这样的功能。假设,我们在GPer社区中发布一篇文章,文章编辑的过程需要花很长时间,中间也会不停地撤销、修改,甚至可能要花好几天才能写出一篇精品文章,因此可能会将已经编辑好的内容实时保存到草稿箱。首先创建发起人角色编辑器Editor类。public class Editor { private String title; .原创 2021-11-23 14:10:28 · 1131 阅读 · 0 评论 -
这个无敌设计,可以解析并运算任意数学表达式
本文节选自《设计模式就该这样学》1 使用解释器模式解析数学表达式下面用解释器模式来实现一个数学表达式计算器,包含加、减、乘、除运算。首先定义抽象表达式角色IArithmeticInterpreter接口。public interface IArithmeticInterpreter { int interpret();}创建终结表达式角色Interpreter抽象类。public abstract class Interpreter implements IArithmeti.原创 2021-11-18 15:06:10 · 800 阅读 · 2 评论