- 博客(117)
- 资源 (76)
- 收藏
- 关注

原创 精心汇总GOF23种设计模式专栏(Java实现)
创建型设计模式SingletonBuilderPrototypeAbstract FactoryFactory Method结构型设计模式AdapterBridgeCompositeDecoratorFacadeFlyweightProxy行为型设计模式Chain of ResponsibilityObserverStateStrategyTemplate MethodInterpreterVisitorMementoIteratorCommand
2020-07-28 16:37:01
144
原创 Mac 安装 PostgreSQL简易教程
拖拽图标到右边的文件,然后到应用程序中找到 Postgres.app 双击打开。我下载的文件:Postgres-2.7.3-16.dmg。双击一个数据库打开终端, 然后可以进行一系列命令操作。配置$PATH 到命令下工具(这边可选)然后点击 Initialize 按钮。双击 dmg 文件安装。
2024-05-27 19:58:11
756
原创 Java Agent 实战
本文主要介绍 Java Instrumentation API 的使用以及 Java 提供 Instrumentation 的目的。premain- 在 JVM 启动时静态加载,通过-javaagent 参数指定 jar 文件路径agentmain通过 java attach api 动态加载 agent 到 JVM。
2023-07-20 20:00:59
400
原创 你在用面向对象语言Java写C风格的代码吗?
在开始之前,先来讲个小故事在一次代码评审中,小李兴致勃勃地给大家讲解自己用心编写的一段代码。这段代码不仅实现了业务功能,还考虑了许多异常场景。所以,面对同事们提出的各种问题,小李能够应对自如。在讲解的过程中,小李看到同事们纷纷点头赞许,心中不由得生出一丝骄傲:我终于写出一段拿得出手的代码了!讲解完毕,久久未曾发言的技术负责人老赵站了起来:“小李啊!你这段代码从功能上来说,考虑得已经很全面了,这段时间你确实进步很大啊!”要知道,老赵的功力之深是全公司人所共知的。能得到老赵的肯定,对小李来说,那简直是莫大
2020-09-17 10:31:05
378
原创 一文讲透 Stream.reduce()
Stream API 提供了丰富的中间函数,归并函数和终端函数,这些函数还支持并行化执行。而归并流的操作的作用是从一个序列的元素重复应用合并操作,最后产生一个单一的结果返回。本文,我们讲探讨 Stream.reduce() 常用的功能并举例说明。关键概念:初始值的定义(Identity),累加器(Accumulator),组合器(Combiner)在深入讨论 Stream.reduce() 功能之前,让我们先了解几个概念Identity : 定义一个元素代表是归并操作的初始值,如果Stream 是空
2020-09-02 10:07:47
49160
8
原创 一文搞彻底搞懂 Spring FactoryBean
本文我们讲探讨Spring 框架中的 org.springframework.beans.factory.FacotryBean<T> 接口,接口定义如下:public interface FactoryBean<T> { T getObject() throws Exception; Class<T> getObjectType(); boolean isSingleton();}FactoryBean 是一个在一个类里封装如何构建一个对象的模式,他
2020-08-13 09:38:37
393
原创 SOLID原则-依赖倒置原则
简介前面我们已经介绍了SRP ,单一职责原则OCP,开闭原则LSP,里式替换原则ISP,接口隔离原则今天来详解依赖倒置原则。作为一个Java程序员,你可能听说过代码耦合以及被告知应避免代码紧耦合。不关注如何写出好代码是代码紧耦合的主要原因。例如,用 new 关键字在一个类中创建另一个类的对象会造成两个类的紧耦合,这样的耦合看上去无害且没有使较小的程序混乱,但是,当你在企业应用开发时,紧耦合的代码可以导致严重不利的后果。当一个类确切的知道另一个类的设计和实现逻辑时,一个类的变化会引起另外一
2020-08-09 20:54:57
740
原创 SOLID原则-接口隔离原则
简介前面我们已经介绍了SRP ,单一职责原则OCP,开闭原则LSP,里式替换原则今天来讲解接口隔离原则。接口是Java 编程语言的核心功能之一,在企业应用开发中被广泛应用来抽象业务和多接口的实现能力。从写代码的角度,写一个接口是简单的,你可以用 interface 关键字创建一个接口并在接口里声明一些方法,其他的类可以通过 implements 关键字来实现接口定义的方法。作为一个 java 使用者,你肯定写过很多接口,但是有没有想过这样一个问题:之前写的接口是否是合理的,有没有好的设计原则
2020-08-06 15:32:37
595
原创 SOLID原则-里式替换原则
使用面向对象的语言编写业务时,为了提高代码的复用度,会经常继承现有的类,继承也是面向对象语言的三大特性之一,其他两个是封装和多态。那有没有办法判断继承实现的合理性呢?有的,使用里式替换原则来判断继承的合理性。如何理解里式替换原则2008年,图灵奖授予 Barbara Liskov,表彰她在程序语言设计和系统设计方法方面的卓越工作。她在设计领域影响最深的就是以她的名字命名的 Liskov 替换原则(Liskov substitution principle,简称 LSP)。她是这么描述这条规则的:If
2020-08-05 17:16:47
299
原创 SOLID原则-开闭原则
开闭原则定义Robert C. Martin 认为这个原则是面向对象设计中最重要的一个原则,但他不是第一个定义这个原则的人,Bertrand Meyer 在1988年写的一本书《Object-Oriented Software Construction》,其中解释了开闭原则:软件实体(类,模块,方法等)应该对扩展开放,对修改关闭。这个原则的主要思想是很棒的,它告诉我们写代码时,当添加新功能时不应该修改现有的代码,这样阻止了我们修改一处代码所依赖它的代码都要修改。但是有点可惜的是,Bertrand May
2020-08-04 10:06:59
480
原创 SOLID原则-单一职责原则
简介本文我们将讨论面向对象编程中著名的 SOLID 原则之一的单一职责原则。我们将深入讲解什么是单一职责原则和在设计代码时如何实现它,最后将如何避免滥用此设计规则。单一职责的英文表达为 Single Responsibility Principle ,简称 SRP。单一职责原则详解就像它的名字的字面意思一样,这个原则表示每个类应该只有一个职责,也就是只有一个目的,一个类只做一样工作,以此可以推断出这个类只有一个原因被修改。我们不想让对象知道的太多以及承担与自己无关的职责,否则,这些类很难维护,例如,一
2020-07-30 19:23:25
791
原创 设计模式系列-抽象工厂模式-Abstract Factory
抽象工厂模式简介在之前有一篇文章介绍了工厂方法模式,其中有个例子是为不同格式的XML开发了各自的解析器,然后把解析出来的XML打印出来,现在需求有了变化,为不同的客户端提供一组不同的解析器,加入有个客户端命名为 NY,我们为它提供了一组解析器的名称为 NYErrorXMLParser ,NYFeedBackXMLParser,NYOrderXMLParser,NYResponseXMLParser,同样的,我们以为名为TW的客户端提供一组类似命名的解析器。此时,抽象工厂方法模式无法满足我们的需求,我们将为
2020-07-28 16:03:04
283
1
原创 设计模式系列-工厂方法模式-Factory Method
案例介绍有这样一个场景,一个公司通过XML格式数据与客户通信,他们从客户那里接受订单,订单中发生的错误,上一个订单的反馈,以及对订单的响应信息等都是通过XML格式数据,而且每种通信是不同的XML 格式数据。公司想开发一个应用来完成XML的解析和显示。如果你来研发此应用,你该去如何设计开发呢?首先仔细分析下上面的需求,核心需求是不同的XML格式数据需要不同的解释器,但是处理这些格式的数据的主逻辑都是一样的,从XML数据获取信息然后显示信息。分析完需求后,你可能需要一个工厂生产XML 解析器,而且是在运行
2020-07-22 16:09:41
246
原创 设计模式系列-访问者模式-Visitor
案例介绍在正式介绍访问者之前,我们先看一个需求,用java代码组装一个html, 并能输出html 的字符串表示,html 中有各种标签,比如 <html></html ,<body></body>,<p></p> 等, 有的标签可以包含其他标签,如 html,body 等,则有的标签不需要包含,如p 标签只包含一些文字。现在我们来分析需求,根据需求 html 有很多种类的标签,每个标签都有一些共有的属性,如标签名称、开始标记法和结束标记
2020-07-21 19:19:52
181
原创 设计模式系列-调停者模式-Mediator
调停者模式简介良好设计的应用由轻量级的对象组合而成,这些对象具有特定的职责,符合SOILD 的单一职责原则。然而,这些大量轻量级的对象给应用带来好处的同时也带来了对象之间交互通信的挑战。对象间需要通信来完成业务需求,当对象数量不断增加时,通信很快变的很难管理。另外,对象之间通信需要感知对方的存在,紧耦合在一起的对象违反了 SOLID 原则。调停者模式被证明可以解决这样的问题。调停者模式定义了一个调停者(Mediator)对象来处理对象之间的交互,进而替代一组对象之间直接交互。下图简单展示有无调停者模式对
2020-07-17 10:25:27
401
原创 设计模式系列-解释器模式-Interpreter
解释器模式介绍现实生活中,我们经常碰到需要解释手语的情况,当你看到一个手语时,它代表着一个具体的意思,但是根据不同的文化背景,我们的解释可以不同的意义。类似情况,在编程世界里,应用从不同的来源接收用户的输入信息,比如浏览器、程序界面、命令行、或者手机等。用户输入可以用不同的格式来表示,例如数学计算表达式可以用中缀、前缀、后缀表达法,还有,当一个新的表达法被引入时,我们不需要更改客户端代码,用解释器模式可以自动和灵活的处理用户输入的表达式。解释器模式的目的是处理用户输入的表达式和根据表达式构建抽象语法树
2020-07-13 18:17:16
289
原创 设计模式系列-迭代器模式-Iterator
迭代器模式介绍一个集合对象,如List,要提供一个访问它元素的方法,前提是不暴露它的内部结构。此外,你可能根据不同的场景对集合对象选择不同的遍历方法,你不想把遍历逻辑放在对象集合中,这样会增加集合对象的复杂度,你甚至在某个场景下对同一个集合对象进行多次遍历。带着这些前提条件该如何实现集合对象的遍历呢?迭代器模式可以解决上面提出的问题,它的核心思想是提供一个额外的对象负责访问和遍历集合对象。 Iterator 是一个接口负责访问集合的元素,迭代器对象负责记录集合被遍历的当前元素,也就是说它知道集合里的哪
2020-07-09 16:37:25
150
原创 设计模式系列-备忘录模式-Memento
介绍我们通常使用的办公软件都有回退功能,你还想过这样的功能是如何实现的呢?相比软件的回退功能比较复杂,我们还是举个对象状态回退的功能,要回退状态,首先得记录对象的历史状态数据,当回退到某个状态时,能从数据存储的地方恢复到对象状态里。通常我们把对象的状态数据封装起来,外部对象无权访问内部状态,如果状态暴露就好违反封装特性,会对应用的可靠性和扩展性作出妥协。备忘录模式可以在不破坏对象封装特性的前提下解决我们上面的问题,也不会暴露对象的内部结构。为了更好的理解备忘录模式,我们举个案例来说明,创建一个类,有两个
2020-07-08 19:45:44
188
1
原创 设计模式系列-责任链模式-Chain of Responsibility
责任链模式介绍责任链模式是一种行为类型的模式,以某种顺序组合一组同类型的对象用来处理一个业务请求,如果组内某个对象处理了请求,处理完毕返回并作出相应的相应(repsone),否则,会把请求按次序转发给组内另一个对象处理。举个现实生活中的例子来更好的理解此模式,假如你有一个难题要解决,如果你能自己解决掉,不会再请别人帮忙,否则,你会请朋友帮忙,如果你朋友也解决不了,他会继续请他的朋友帮忙解决,依次类推直到问题解决,或者最终问题没有解决。类似上面的例子,假如你接到一个需求,帮助一个保健公司做一个分析类的应
2020-07-07 17:38:57
234
原创 设计模式系列-策略模式-Strategy
本文我们将讨论策略模式,是非常常用的一个模式,我们应该熟悉掌握,策略模式的定义:定义一系列算法,每个都封装起来可换着使用,策略使算法独立于使用它的客户端而变化。使用策略模式可以使我们的代码设计高内聚、松耦合。策略模式介绍在应用开发中,你将经常编写一些利用不同算法来满足一些业务需求的对象。一个常见的例子是支持数字排序的类,可以用冒泡排序、合并排序和快排。类似的,一个文件压缩类可以支持不同的压缩算法,比如ZIP,GZIP,LZ4 或者一个定制的压缩算法。另一个例子是数据加密类可以用不同的加密算法,例如AES
2020-06-28 22:20:03
256
原创 设计模式系列-享元模式-Flyweight
为了更好的理解享元模式,我们需要理解两个概念:- 固有数据:存储在享元对象里,和其他对象共享- 非固有数据:不能共享的数据,存在客户度对象里,用来被计算或者传入享元对象
2020-06-24 14:09:50
143
原创 设计模式系列-原型模式-Prototype
原型模式介绍原型模式属于创建对象类型模式,获取一个类的对象时不是每次从头创建一个新对象,而是从先创建类的一个对象作为原型,每次获取对象时从已创建好的对象复制一份。在Java 中,实现原型模式,一般通过对象克隆技术实现。为什么创建对象时是对象复制而不是通过构造方法创建一个对象呢?哪个方式更简单?大部分情况下不需要复制对象,但是在企业应用开发中对性能要求比较苛刻,比如创建一个对象需要调用非常耗时的操作,比如网络请求、读数据库或者读取磁盘文件,创建耗时的逻辑被大量请求,为了提升性能避免重复创建,这时可以用原型
2020-06-22 19:02:53
179
原创 设计模式系列-桥接模式-Bridge
桥接模式介绍我们用抽象来解耦客户端代码和实现,通常的做法是用继承(inheritance)的方式。我们定义一个接口或抽象类,然后基于接口或抽象类来创建继承层级,可能会存在多个实现。尽管第一眼看上去此方式从逻辑上好像没啥错误,但不总是不那么灵活。当用继承实现时,我们会自然的把抽象和实现绑定在一起。造成的结果是一端发生变化总会影响到另一方。一个更灵活的方式是分离抽象和实现,这就是桥接模式要做的事情。桥接模式的参与者为了理解桥接模式如何工作的,我们举一个消息发送的例子,客户端可以用我们的消息发送程序来发送不
2020-06-18 19:17:26
225
原创 设计模式系列-门面模式-Facade
案例要研发一个任务调度服务,用类 ScheduleServer 表示,客户端代码在调用服务时,需要先初始化完成任务是关掉服务来释放资源,初始化任务调度服务时需依次调用如下方法startBooting() , 启动引导程序readSystemConfigFile(),读取系统配置文件init(),初始化资源initializeContext(),初始化上下文initializeListeners(),初始化监听器createSystemObjects(),创建所需的系统对象关闭任务调度服务
2020-06-13 15:10:40
212
原创 设计模式系列-模板方法- Template Method
案例经常做饭的同学都比较熟悉炒菜的流程,主流程是热锅、热油、加配料、放菜翻炒、装碟,每道菜的制作流程基本一致,但是每个步骤对每道菜来讲是不同的,现在要抄两道菜,一是酸辣土豆丝,制作流程:热锅、加豆油、加辣椒和醋、放入土豆丝翻炒、装碟;二是西红柿炒蛋:热锅、加菜籽油、加鸡蛋、放入西红柿翻炒、装碟。以上描述了案例基本需求,下面先介绍模板方法模式的定义,然后用此模式实现案例需求。模板方法模式在一个方法里定义一套算法的骨架并把算法的细节部分委托给子类实现,也就是说,子类实现算法的细节步骤而不会改变算法的整体
2020-06-11 16:32:35
145
原创 一文彻底搞懂Java8 Optional 怎么用
Java 8 之前的问题在Java 8 之前,编写一个在特定条件下无法返回值的方法时,有两种方法:一是抛出异常,二是返回null (我们假设方法返回的是对象引用类型),这两种方法都有缺点,抛出异常会捕获整个堆栈轨迹,会有一定的性能开销,返回null 没这缺点,但是会强迫客户端代码有判断值为null 处理代码,如果忽略判断,在运行时可能抛出 NullPointerException 异常。Optional 简介java 8 引入了类 Optional , 一个容器类,用 final 修饰,它可以存放一个
2020-06-07 17:01:39
713
原创 设计模式系列-状态模式-State
案例接到一个研发做饭机器人的需求,需求比较简单,这个机器人只会做三件事:走路,做饭,关机。做每件事都有前提条件,只有在开机状态下才能走路,做饭和关机,类似的,在做饭状态下可以进行走路或者继续做饭。拿到需求分析后,一种简单的设计和实现是,设计一个类,此类有走路、做饭和关机的方法,在执行方法前,用 if 或者 switch 语句判断当前机器人的状态是否运行执行。这种把状态和方法耦合在一起再加上分支条件判断的方案,代码会随着需求的变化复杂度会增加而且难以维护。有没有有一种设计方案,符合开闭原则-面向新增开放
2020-06-06 20:58:18
272
原创 设计模式系列-代理模式-Proxy
代理模式可用于对原始对象增加访问控制或者审计方法参数,或者调用远程的对象方法(RPC),对于客户端来说隐藏业务额外的逻辑和复杂度。
2020-06-04 15:27:59
142
原创 设计模式系列-构造器模式-Builder
案例我们有个类,代表银行账户,有一些成员变量,代码如下:public class BankAccount { private long accountNumber; private String owner; private double balance; public BankAccount(long accountNumber, String owner, double balance) { this.accountNumber = accountNu
2020-06-02 12:51:34
198
原创 设计模式系列-命令模式-Command
案例我们需要开发一个遥控器,遥控器上的按钮可以开关电灯和空调,这个需求通常的实现如下伪代码:if(buttonPressed == button1){ lights.on()}else if(buttonPressed == button2){ airConditioner.on()}遥控器类 RemoteControl 耦合每个按钮关联的业务实现,比如上面的例子耦合了 light 和 airConditioner,如果业务有新需求需支持电视的控制,类 RemoteControl 的复杂度和
2020-05-30 23:23:53
194
原创 设计模式系列-观察者模式-Observer
设计模式系列-观察者模式-Observer需求背景需求分析观察者模式意图参与者参与者结构需求背景一个体育资讯类网站准备为会员提供一个订阅直播体育赛事比分功能,一场直播赛事的比分发生变化会及时通知到订阅该直播的会员,当会员对直播赛事不感兴趣时也可以取消订阅,如果该网站找到你去实现此功能,你该如何实现呢?需求分析核心需求是多人订阅一个直播赛事,会员可以主动订阅和取消订阅,抽象的核心模式是一对多...
2020-05-27 15:15:57
262
原创 设计模式系列-单例模式(Singleton)
设计模式系列-单例模式定义实现方式基于类的实现基于枚举的单例定义在一个JVM实例内存中有且只有一个类的实例。实现方式基于类的实现public final class ClassSingleton { private static ClassSingleton INSTANCE; private String info = "Initial info class"; private ClassSingleton() { }
2020-05-25 21:33:32
191
原创 设计模式系列-组合模式 (Composite)
组合模式 (Composite)简介类层次和调用关系示例简介从字面意思得知,此模式把多个对象组合起来,以树形的方式组合对象表达 “部分-整体” 的层次结构,因树形节点分为叶子和分叶子,所以这些对象以此类推也分为简单和组合对象,但都实现同一个接口,目的是让调用端统一处理这些对象。类层次和调用关系示例以公司部门组织结构为例,逐层打印部门名称,首先定义核心接口 Departmentpub...
2019-06-18 13:00:04
265
原创 设计模式系列-适配器模式(Adapter)
简介别名包装器(Wrapper)使不兼容的两个接口通过适配的方式一起工作,一般是一个老接口通过适配器来适配新接口,因为老接口已经被大量引用,更改老接口会带来较大的工作量和bug隐患。类层次和调用关系图示例项目中数据展示一般会有分页需求,开始阶段我们定义一个接口:OldPagination来表示分页信息,详情如下:public interface OldPagination { ...
2019-06-14 17:35:29
163
原创 设计模式系列-装饰者模式(Decorator)
设计模式系列-装饰者模式(Decorator)简介类层次关系图示例简介别名是包装器模式(Wrapper)在运行时可以动态的给一个对象添加功能,不会影响到同一个类的其他对象。通常是通过继承的方式扩展类的功能,但是这种方式会影响类的所有对象。类层次关系图示例代码...
2019-06-13 18:51:14
150
原创 Spring Boot 在Mac 的Intellij Idea 启动卡顿的解决方法
Freezes after saving caches when debugger connects on macOS SierraFreezes for about 9 seconds when performing "Finished. Saving caches" (see the attached screenshot and log).I noticed nothing obvio...
2018-11-25 15:06:26
746
原创 Spring Boot 2.0 从入门到精通-Secuirty
如果把Spring Security依赖添加到 pom.xml 中,Spring Boot 会自动为web 应用启用安全保护,默认会初始化一个用户,用户名为:user,密码会随机生成一个字符串,在项目启动时查看启动日志会发现如下内容(日志级别要设置为Info):Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf...
2018-03-16 17:06:56
3743
原创 Spring Boot 2.0 从入门到精通-Profiles
Spring Boot 利用Profile 区分项目中不同环境读取不同的配置文件和代码,最常见的比如:开发和生产环境连接不同数据库。本文以开发环境连接H2,生产连接mysql 为例讲解。阅读本文前最好阅读此文 点击打开链接。在resources目录下添加application-dev.properties,内容如下#h2spring.datasource.url=jdbc:h2:file:~/t...
2018-03-15 14:11:18
937
97ThingsEveryJavaProgrammerShouldKnow.pdf
2020-06-07
MLDN魔乐科技JAVA培训_Oracle课堂25_数据库设计范式 PowerDesigner工具.rar
2009-10-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人