Java设计模式
呕心沥血之作,尽可能用最朴实的语言帮你理解设计模式!
程序员·小李
不知道要干什么的时候,停一停,想一想;知道想要什么的时候,努努力,拼一拼。
展开
-
【Java设计模式】观察者模式
建立对象之间的一对多的关系,当对象属性发生变化时,依赖对象可以被通知到。观察者:监控别人状态的对象。发布者:将自己的状态变化通知到别人的对象。观察者对于发布者的观察是自由的,可以观察,可以放弃观察。观察者向发布者注册(追求者向被追求者示好)发布者向订阅者发送通知(被追求者通知“备胎们”自己已脱单)小红早已心灰意冷,放弃等待回音。原创 2019-08-04 11:07:51 · 274 阅读 · 1 评论 -
【Java设计模式】构造器模式
将构造结果和构造过程分离,调用方不直接参与构造,而是主流程地将完成各个部分的构造,最终获得构造对象。如果对象的构造过程相对复杂,这样的构造模式会非常有效。你一定曾经尝试过构造一封邮件吧?标题。。收件人。。抄送人。。正文。。附件。。如果你按部就班地构造一封邮件,那么需要很长一段逻辑去创建一个Mail对象。如果把邮件的构造过程抽象出来,可能就是简单的两步:构造Head构造Body。原创 2019-08-05 17:29:00 · 1276 阅读 · 1 评论 -
【Java设计模式】记忆模式
将对象内部的状态备份下来以便于恢复。【实例】对对象的实际状态进行记忆,以便于恢复到历史某个阶段。【实现】{{}{}}可以通过构造函数创建记忆,也可以通过函数获取记忆。{Memento m;{}// 生成记忆/备份{return m;}// 恢复数据{}}源对象可以生成记忆,也可以从历史记忆中获取数据恢复状态。{{}{}}看守者负责管理记忆,但不会查看记忆内容。...原创 2019-08-05 16:45:36 · 377 阅读 · 0 评论 -
【Java设计模式】来访者模式
在不破坏原有设计的基础上对类进行扩展的一个思路。知道JAVA8的stream中Consumer函数式接口的用法嘛?知道就不用看了。原创 2019-08-06 10:55:15 · 141 阅读 · 0 评论 -
【Java设计模式】翻译官模式
【定义】不同的方言规定的是不同语种的翻译标准,实际的工作交由Translator负责,不同的Expression支持不同的输出。【实现】实现两种对字符串转换方式:class Context{ //获取输入 public String input; public Context(String input) { this.inpu......原创 2019-08-06 11:20:30 · 451 阅读 · 0 评论 -
【Java设计模式】代理模式
对真实对象包装,调用方对代理和实际对象的使用有一致的调用体验,最后落到实际对象的调用。其实最终吃到的还是牛肉,但是外部并不知道obj的存在,只知道买了个羊头,吃着是牛肉味儿。原创 2019-08-04 16:33:18 · 150 阅读 · 1 评论 -
【设计原则】里氏替换原则
里氏替换原则说的是,凡是使用父类的地方,要确保传入子类是没有问题的。正如上图所示,扳机是红色、绿色、蓝色的玩具枪都可以扳动扳机,但是没有扳机的玩具枪是无法扣动扳机的。不符合原则的示例interface Payment { void previousPaymentInfo(); void newPayment();}class RegisteredUserPayment implements Payment { String name;原创 2022-05-29 18:33:56 · 135 阅读 · 0 评论 -
【设计原则】支持扩展、封闭修改原则
在程序设计之初,就要考虑到未来需求的变更走向问题,为后续的扩展留足余地,而不是设计一版改了又改。违背原则的示例假设我们有这样的需求:设计一个程序,提供学生基础信息的存储,按自然科学和人文科学进行分类,对不同类别的学生绩点数据进行判断是否合格。class Student { // Some fields, if any public void displayResult() { // some code } public void eva原创 2022-05-28 11:19:30 · 155 阅读 · 0 评论 -
【Java设计模式】模板(抽象)方法模式
我们对操作设定一个框架,将具体的步骤推迟到子类去DIY,允许子类在不改变基础结构的基础上重新定义算法的步骤。上图中的模板就是“起床->洗漱->吃饭->上班”具体怎么起床,穿什么衣服,洗漱是怎么洗漱的,吃饭吃的是什么,上班是选择什么出行方式,由实现类给出具体的,模板中只是规定这样的功能或者操作步骤,具体功能的实现,具体操作步骤的内容,留足自由度给实现类。...原创 2019-08-05 10:06:14 · 452 阅读 · 0 评论 -
【Java设计模式】适配器模式
解决接口的不兼容的问题:现有的处理逻辑可以复用,但是不完全匹配需求,需要借助适配器转换一下。适配器模式就是解决“刺头儿”,实现大一统:1. 风扇可以turnOn2. 电视是open3. 好了来个大一统,我就要用turnOn调用所有家用电器!这么一来,我们用了一个类似于代理的东西完成了turnOn到open的转换,对原代码没有侵染性。原创 2019-08-05 10:50:31 · 466 阅读 · 1 评论 -
【Java设计模式】迭代器模式
使用迭代器对容器的元素进行迭代,我们无需关心内部具体的存储结构,只要实现同样的接口,即可实现相同的迭代效果。原创 2019-08-05 11:45:53 · 205 阅读 · 0 评论 -
【Java设计模式】策略模式
定义一组算法,不同具体实现之间可以随意插拔替换。我们可以动态地改变具体的实现。可实现动态插拔策略模式本身强调的是不同策略对相同数据的不同实现和处理策略,实现策略的热插拔替换。实际上,在使用过程中,策略的热插拔不是靠人工判断的,而是在执行策略的前一步还有一个选择策略的过程,一般是:1. 选择合适的策略模型2. 填充选择的模式,使用该模型处理数据而策略的选择可以采用工厂模式,抽象工厂模式,或者条件过滤模式。...原创 2019-08-05 10:30:53 · 181 阅读 · 0 评论 -
【Java设计模式】抽象工厂模式
简单工厂模式在创建对象的时候需要指定对象类别的名称,根据名称创建对象,抽象工厂通过对不同类别的对象创建的分别实现,解决了此类问题。扩展性相对较好。原创 2019-08-06 09:22:37 · 182 阅读 · 0 评论 -
【Java设计模式】桥接模式
使用接口实现解耦,在抽象类与实现类之间解除过度耦合,通过接口实现可插拔。(说法上很高级,其实使用Spring的我们天天都在使用这个模式)原创 2019-08-06 10:42:27 · 172 阅读 · 0 评论 -
【Java设计模式】单例模式
单例模式可以节省资源,解决冲突问题。具体实现比较倾向于内部类。原创 2020-04-27 07:48:04 · 175 阅读 · 1 评论 -
【设计原则】单一职责原则
A class should have only one reason to change.单一职责就是说,不要所有的东西都堆到一起,按照他们的职责边界拆分到不同的模块/类中。将所有东西堆放在一起容易“牵一发而动全身”,修改一处需要回归测试全部的功能。违背单一职责原则的示例import java.util.Random;class Employee { public String firstName, lastName, empId; p.原创 2022-05-28 00:35:57 · 123 阅读 · 0 评论 -
【设计原则】依赖反转原则
依赖反转原则指的是,将依赖具体的实现替换成对抽象类、抽象接口的依赖,方便修改和抽插式替换。如上图,小人儿没有指定红色的玩具枪使用,而是告诉玩具枪厂商给我一把玩具枪,具体是一把红色的玩具枪,还是绿色的玩具枪,并没有直接指定。一种不符合依赖反转原则的示例class UserInterface { private OracleDatabase oracleDatabase; public UserInterface() { this.oracleDatab原创 2022-05-29 22:58:08 · 340 阅读 · 0 评论 -
【Java设计模式】轻量模式
在工厂中维护一些对象,当需要创建对象的时候,先检查是否已经存在创建好的对象,如果存在就返回对象本身,否则创建对象并存储在工厂中。这样轻量级设计有利于节省内存。轻量模式在本质上就是“单例模式”+“简单工厂模式”,这也是SpringContainer一直践行的模式。...原创 2019-08-06 09:12:00 · 452 阅读 · 0 评论 -
【Java设计模式】装饰者模式
【定义】我们无法改变现有的功能,但是我们可以扩展他们。这个模式对修改是封闭的,对扩展是开放的。当我们想对某个特定的对象添加特定功能而不是整个类,这个概念就适用了。【实现】设计抽象类与抽象方法:abstract class Component{ public abstract void doJob();}设计实现类:class ConcreteCompone......原创 2019-08-04 16:55:40 · 145 阅读 · 0 评论 -
【Java设计模式】工厂方法模式
建立抽象,确定规则,调用方无需关心具体实现的细节,让具体的实现推迟到具体实现类。通过标志(字符串、枚举等等)让工厂类生产相应的实现类的对象,对外屏蔽对象创建的细节,实现一组对象构造的统一管理。...原创 2019-08-05 15:13:17 · 225 阅读 · 0 评论 -
装饰者模式&&代理模式&&责任链模式
而责任链模式会关注嵌套的顺序问题,进而存在优先级的问题,层级在前的具有高优先级,优先执行,并有“短路”的权利,拒绝下一层级的调用。进而对对原始功能类的访问的控制,由原来的直接通过getter和setter方法进行访问,进而变成了对代理类对象的访问,实现了对访问的。2.装饰者模式关注的是嵌套结束的最后那个代理,而责任链模式关注的是第一个进行嵌套的那个代理。也就是说无论嵌套关系是怎么样的,装饰者模式直接调用的是最后一层,而责任链关注的是第一层。那么,这样在原始的操作类的基础上扩展功能的方式叫做。...原创 2021-04-28 11:00:24 · 408 阅读 · 0 评论 -
【Java设计模式】命令模式
对命令进行抽插式设计,不同的Command包装Receiver的不同操作,使用Invoker发起指定Command的调用,这里调用不同的Command意味着调用Receiver不同的方法。类似于发通知,你可以短信通知,也可以邮件通知,那么短信就是一种command,邮件是另外一种command,而通知内容就是receiver当然,这里可以存在两个层面的抽插式替换,一个是command在invoker中的热插拔,另一个是receiver在command中的热插拔。...原创 2019-08-05 11:24:29 · 277 阅读 · 0 评论 -
【Java设计模式】原型模式
【定义】通过复制来创建对象可以减少创建对象带来的代价。通过clone而不是new创建新的对象【实现】建立汽车的抽象父类,并实现Cloneable接口:public abstract class BasicCar implements Cloneable{ public String modelname; public int price; publi...原创 2019-08-06 09:52:09 · 111 阅读 · 0 评论 -
【Java设计模式】责任链模式
类似于异常处理机制,前一个异常处理器如果能够处理异常的话将直接处理,否则提交给下一个处理器。或者类似于ASP.NET的处理管道机制,每个处理层面都维护着下个层面的引用,当前能够处理会直接处理,否则移交下一层。有点Fail fast的赶脚。...原创 2019-08-06 10:12:37 · 197 阅读 · 0 评论 -
【Java设计模式】概述
定义了一种支持外部接口处理自身对象的一种能力,可以提供不同的处理能力的实现,但常用的方式是只用于读操作,不修改对象的状态。属于模版方法中的一种应用,将接口的功能点规定好,屏蔽底层存储结构的区别,提供标准化的遍历数据的方法模式,由不同的迭代器实现具体定制不同存储结构的遍历方法。在修改实例的状态前,先备份一下,等到后续再需要的时候,可以恢复到备份前的状态。因为状态的改变,引发对象的行为改变。通过组合的方式,将被装饰的对象安插在装饰者的对象里,对装饰者的调用实际上完成的是在装饰的基础上对被装饰者的调用。原创 2019-08-04 10:29:49 · 253 阅读 · 1 评论 -
【Java设计模式】中介模式
【定义】中介最大的特点就是隔离性,隔离性在程序中的表现就是解耦。对于朋友之间,与上司之间的通信,交由第三方处理即可。对象之间不建立耦合关系,他们各自只与中介产生关联。【实现】定义抽象类及抽象方法:abstract class Mediator{ public abstract void Send(Friend frd, String msg);}实现具体的中介...原创 2019-08-06 09:40:43 · 117 阅读 · 0 评论 -
【Java设计模式】复合模式
对象的内部还有对象,这就是复合模式。在Teacher对象中,包含着List这便是复合模式。存在Has-A的关系。原创 2019-08-06 10:26:40 · 333 阅读 · 0 评论 -
【Java设计模式】表象模式
将实际的工作封装起来,对外暴露的内容最小。提供更高级别的抽象接口,更便于使用,不强调具体的实现。表象模式和构建者模式的区别在于,构建模式是选择性暴露构建过程,根据输入达到不同的构建结果的目的;表象模式在于屏蔽过程,提供统一的接口。...原创 2019-08-05 14:55:05 · 372 阅读 · 0 评论 -
【设计原则】接口隔离原则
接口隔离原则与单一职责原则、里氏转换换原则有密切的联系。在里氏转换换原则中,我们将杂糅在一个接口中的两个方法,拆分到两个不同的接口中,解决了子类不支持父类接口中某个方法的场景。另一个接口杂糅的示例interface Printer { void printDocument(); void sendFax();}定义了打印机的两个功能。class BasicPrinter implements Printer { @Override pub.原创 2022-05-29 22:21:31 · 107 阅读 · 0 评论 -
【Java设计模式】状态模式
因为状态的改变,引发对象的行为改变。在状态改变时,抽拔式替换下一行为。状态和行为相关度较大,必须具备因果关系。当前状态为开,执行关闭操作,并更新状态为关,更新下一步操作为打开。当前状态为关,执行打开操作,并更新状态为开,更新下一步操作为关闭。辅助理解: 可参考toogleButton的设计。...原创 2019-08-05 17:15:07 · 175 阅读 · 0 评论