
设计模式
内功心法之设计模式
刘总Java
刨根问底,知其然知其所以然。
不做标题党,纯纯的干货。
在曲折中前进,在前进中曲折...
展开
-
设计原则&设计模式学习入口
今天的博客主题 设计模式——》设计原则&设计模式学习入口设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性,扩展性。设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。来自灵魂深处的拷问1)什么是设计原则?什么是设计模式?答:答案在上面2)学了设计模式能干什么?答:答案在上面3)设计原则和设计模式什么关系?...原创 2020-06-07 23:09:50 · 216 阅读 · 0 评论 -
二、24【设计模式】之各个模式练习题
今天的博客主题 设计模式——》设计模式之各个模式练习题温故而知新简单工厂模式练习题原创 2020-06-30 21:54:55 · 871 阅读 · 0 评论 -
二、23【设计模式】之委派模式
今天的博客主题 设计模式——》设计模式之委派模式委派模式 DP (Delegate Pattern)定义委派模式也被称为委托模式,是一种面向对象的设计模式。是对象组合实现与继承相同的代码重用。基本的作用就是负责任务的调用和分配,也是一种特殊的静态代理,可以理解为是全权代理,但是代理模式关注的是过程,而委派关注的是结果。(委派模式不属于Gof23种设计模式)应用场景一个任务又多个部分组成,可将任务细化,搜集结果汇总。优点通过任务委派...原创 2020-06-30 21:52:07 · 138 阅读 · 0 评论 -
二、22【设计模式】之备忘录模式
今天的博客主题 设计模式——》设计模式之备忘录模式备忘录模式 MP (Memento Pattern)定义保存一个对象的某个状态,以便在适当的时候恢复对象。其主要是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。是一种有撤销、回退的机制,通过存储系统各个历史状态的快照,可以回滚到某一个历史状态。应用场景1)需要保存历史快照的场景。2)在对象之外保存状态,除了自己其他对象无法访问状态...原创 2020-06-30 21:49:03 · 2685 阅读 · 0 评论 -
二、21【设计模式】之状态模式
今天的博客主题 设计模式——》设计模式之状态模式状态模式 SP (State Pattern)定义允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。核心就是状态与行为的绑定,不同状态对应不同行为。应用场景在生活中的场景常见的就是订单状态的改变。1)行为随状态改变而改变的场景。2)一个操作中有大量分支存在,而这些分支状态又...原创 2020-06-30 21:47:19 · 237 阅读 · 0 评论 -
二、20【设计模式】之解释器模式
今天的博客主题 设计模式——》设计模式之解释器模式解释器模式 IP (Interpreter Pattern)定义给定一门语言,定义它的一种文法表示,并定义一个解释器,用来解释语言中的句子。这种模式一般被用在SQL的解析,符号的处理等。解释器模式也是一种使用频率低学习难度较大的一个设计模式。应用场景1)一些重复出现的问题可以用一种简单的语言来进行表达。2)一个简单语法需要解释的场景。3)编译器,运算表达式的计算4)优点...原创 2020-06-30 21:44:53 · 1823 阅读 · 0 评论 -
二、19【设计模式】之中介者模式
今天的博客主题 设计模式——》设计模式之中介者模式中介者模式 MP (Mediator Pattern)定义用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,达到耦合松散,独立的改变他们之间的交互。其主要是通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。在一个系统中如果对象之间的联系呈现为网状结构,那这些对象之间肯定存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对...原创 2020-06-30 21:42:15 · 197 阅读 · 0 评论 -
二、18【设计模式】之迭代器模式
今天的博客主题 设计模式——》设计模式之迭代器模式命令模式 CP (Command Pattern)定义将一个请求封装成一个对象,使不同的请求把客户端参数化。命令模式是对命令的封装,每一个命令都对应了一个操作:请求方发出命令,接收方执行命令对应的操作。主要是解耦了请求方和接收方,请求方只需关心请求执行的命令,而不关心命令怎么被接收以被处理的。现在写出的代码都是请求者与实现者通常都是一种紧耦合的关系,这样更简单明了,但缺乏扩展性。不适合在某些场合使用(行为记...原创 2020-06-30 21:39:52 · 100 阅读 · 0 评论 -
二、17【设计模式】之迭代器模式
今天的博客主题 设计模式——》设计模式之迭代器模式迭代器模式 LP (Lterator Pattern)定义提供一种顺序访问集合/容器对象元素的方法,而无需暴露集合内部的表示。可以为不同的容器提供一致的遍历行为,不用关系其容器内容元素的组成结构。其本质是抽离集合对象迭代行为到迭代器中,提供一致的访问接口。应用场景1)访问一个集合对象的内容而无需暴露它的内部表示。2)为遍历不同的集合结构提供一个统一的访问接口。优点1)多态迭代,为不...原创 2020-06-29 23:21:19 · 177 阅读 · 0 评论 -
二、16【设计模式】之模板方法模式
今天的博客主题 设计模式——》设计模式之模板方法模式模板方法模式 TMP(Template Method Pattern)定义定义一个操作的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。模板方法实际上是封装了一个固定流程,该流程由几个步骤组成,每个步骤有不同的子类实现,从而让固定的流程产生不同得结果。很简单,就是类的继承机制,也是应用很广泛的一个模式。其本质就是抽象封装流程,进行具体实现。...原创 2020-06-29 23:18:22 · 122 阅读 · 0 评论 -
二、15【设计模式】之访问者模式
今天的博客主题 设计模式——》设计模式之访问者模式访问者模式 VP (Visitor Pattern)定义一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,可在不改变数据结构的前提下定义作用于这些元素的新的操作。访问者模式被称为最复杂的设计模式,使用频率还不高。作者也说了,大多数情况下,你不需要使用访问者模式,但一旦需要使用时,那就真的需要了。应用场景1)优点1)缺点1)源...原创 2020-06-29 23:14:46 · 97 阅读 · 0 评论 -
二、14【设计模式】之观察者模式
今天的博客主题 设计模式——》设计模式之观察者模式观察者模式 OP (Observer Pattern)定义定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新。其核心是将观察者与被观察者解耦,以类似于消息广播发送机制联动两者,使被观察者的变动能通知感兴趣的观察者们,从而做出响应。观察者模式也被称为:发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、...原创 2020-06-29 23:12:17 · 147 阅读 · 0 评论 -
二、13【设计模式】之责任链模式
今天的博客主题 设计模式——》设计模式之责任链模式责任链模式(chain of Responsibility Pattern)定义将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护下一个节点的对象。当一个请求从链式的首端发出时,会沿链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。原文解释:使多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。...原创 2020-06-29 23:09:15 · 124 阅读 · 0 评论 -
二、12【设计模式】之策略模式
今天的博客主题 设计模式——》设计模式之策略模式策略模式 SP (Strategy Pattern)概念策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。定义一组算法(业务逻辑),将每个算法都封装起来,并且使它们之间可以互换。所主要解决的问题是在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。简答说就是定义了算法家族,分别封装起来,它们之间可以互相替换,此模式变化独立于算法的使用者。应用场景1...原创 2020-06-28 23:00:29 · 189 阅读 · 0 评论 -
二、11【设计模式】之桥接模式
天的博客主题 设计模式——》设计模式之桥接模式桥接模式 BP (Bridge Pattern)定义将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承往往违背了类的单一职责,复用性比较差。桥接模式的核心在于解耦抽象和实现。桥接模式是一个非常有用的模式,在桥接模式中体现了很多面向对象设计原则的思想,包括“单一职责原则”、“开闭原则”、“合成复用原则”、“里...原创 2020-06-28 22:57:45 · 159 阅读 · 0 评论 -
二、10【设计模式】之适配器模式
今天的博客主题 设计模式——》设计模式之适配器模式适配器模式 AP (Adapter Pattern)定义将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能在一起工作的类可以一起工作。起着一个转化/委托的作用,将一种接口转换成另一种符合需求的接口。应用场景生活中的场景就是手机充电器的接口,显示器转接头等等很多。1)当希望使用某些现有类,但接口与某些代码不兼容,使用该模式。2)当希望重用几个现有的子类,这些子类缺少一些不...原创 2020-06-28 22:54:31 · 144 阅读 · 0 评论 -
二、09【设计模式】之装饰器模式
今天的博客主题 设计模式——》设计模式之装饰器模式装饰器模式 DP (Decorator Pattern)定义装饰者模式也叫包装模式(Wrapper Pattern),是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象功能)。其核心主要用于透明动态的扩展类的功能,就是功能扩展。应用场景生活中的场景就是,买房装修。原有对象(新房)扩展功能(装修),以此满足用户需求的对象。1)扩展一个类的功能或给一个类添加...原创 2020-06-28 22:48:41 · 175 阅读 · 0 评论 -
二、08【设计模式】之门面模式
今天的博客主题 设计模式——》设计模式之门面模式门面模式 FP (Facade Pattern)定义为子系统里的一组接口提供一个一致接口,门面模式定义了一个高层接口,这个接口使得子系统更加容易使用。应用场景1)子系统越来越复杂,增加门面模式提供简单接口。2)构建多层系统结构,增加门面对象作为每层入口,简化层间调用。优点1)简化客户端调用过程,不需要深入了解子系统,以防给子系统带来其他风险。2)减少系统依赖,松散耦合。3)划分访问层...原创 2020-06-28 22:22:01 · 102 阅读 · 0 评论 -
二、07【设计模式】之代理模式
今天的博客主题 设计模式——》设计模式之代理模式代理模式 PP (Proxy Pattern)定义代理模式是为其他对象提供一种代理,以便控制对这个对象的访问在一些特殊情况下,一个对象不适合或者不能直接引用另一个对象,代理对象就可以在客户端与目标对象之间起到中介的作用。应用场景生活中的租房中介,婚介,黄牛,事物代理,非侵入式的日志监听等都是代理模式的体现。当无法或者不想直接引用某个对象或访问某个对象存在困难时,可以使用代理对象来间接访问。使用代理...原创 2020-06-28 22:19:35 · 172 阅读 · 0 评论 -
二、06【设计模式】之组合模式
今天的博客主题 设计模式——》设计模式之享元模式组合模式 CP (Composite Pattern)定义将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口表示,使得客户端对单个对象或组合对象的使用一致,感受不到差异。组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,最上面的节点称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。就像这样可以看出根节点和树枝节点本质上是同一种数据类型,可以作...原创 2020-06-28 22:11:57 · 126 阅读 · 0 评论 -
二、05【设计模式】之享元模式
今天的博客主题 设计模式——》设计模式之享元模式享元模式 FP (Flyweight Pattern)定义使用共享技术有效的支持大量细粒度的对象。又称为轻量级模式,是对象池的一种实现。类似于线程池,避免不停的创建销毁对象,消耗性能。提供了减少对象数量从而改善应用所需的对象结构方式。其宗旨就是:共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者单独创建一个对象,依次来降低内存CPU的消耗。属于结构性模式。因为要求细粒度的对象,所以不可避免的会...原创 2020-06-22 23:01:51 · 156 阅读 · 0 评论 -
二、04【设计模式】之原型模式
今天的博客主题 设计模式——》设计模式之原型模式原型模式 PP (Prototype Pattern)定义原型实例指定创建对象的种类,通过拷贝克隆的方式创建新的对象。原型模式的核心在于拷贝原型对象。就是当一个对象创建的过程比较复杂,可利用当前系统中已存在的对象作为原型,然后通过拷贝的方式在创建一个对象出来,相当于是克隆(一般基于二进制流进行复制),这样就不用在重新调用这个对象的构造函数,避开对象的初始化过程,使得新对象的创建时间减少,性能提升。应用场景...原创 2020-06-22 22:56:54 · 114 阅读 · 0 评论 -
二、03【设计模式】之建造者模式
今天的博客主题 设计模式——》设计模式之建造者模式建造者模式 BP (Builder Pattern)定义建造者模式是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以构建不同的表示使用建造者模式对用户来说只需要指定需要的建造的类型就可以获得对象,创建过程与细节不需要了解。从而可以达到在用户不用了解底层的代码就可以创建出一个复杂的对象。建造者适用于创建对象需要很多步骤,但是步骤的顺序不一定固定,如果一个对象有非常复杂的内部结构(属性),可以将对象的创...原创 2020-06-22 22:50:14 · 131 阅读 · 0 评论 -
二、02【设计模式】之工厂模式
今天的博客主题 设计模式——》设计模式之工厂模式工厂模式 FP (Factory Pattern)概念工厂模式是最常用的实例化对象模式,它的本质就是代替 new 操作。以后在使用 new 的时候,考虑下看是否可以用工厂模式来代替 new。工厂模式下又分了:简单工厂模式、工厂方法模式、抽象工厂模式优点:1) 一个调用者想创建一个对象,只要知道这个对象名称就可以了。2) 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3) 屏蔽产...原创 2020-06-22 22:42:42 · 197 阅读 · 0 评论 -
二、01【设计模式】之单例模式
今天的博客主题 设计模式——》设计模式之单例模式单例模式 SP (Singleton Pattern)概念单例模式是设计模式中最简单的模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式三要素1)单例类只能有一个实例。2)单例类必须自己创建自己的唯一实例。...原创 2020-06-18 23:08:44 · 144 阅读 · 0 评论 -
二、00【设计模式】之前言总结
今天的博客主题 设计模式——》设计模式之前言总结设计原则回顾1)开闭原则 OCP(Open Close Principle)开闭原则是说:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2)单一职责 SRP (Simple Responsibility Pinciple)单一职责就是一个类或方法只负责...原创 2020-05-31 23:04:49 · 204 阅读 · 0 评论 -
一、07【设计原则】之合成复用原则
今天的博客主题 设计模式——》设计原则之合成复用原则合成复用原则 CARP(Composite/Aggregate Reuse Principle)就是用对象组合 or 聚合,而不是继承关系达到软件复用的目的。这样可以使系统更加灵活,降低类与类之间的耦合度,一个类发生变化对其他类影响较少。继承被称之为白箱复用,就是父类把所有的实现及细节暴露给子类。组合/聚合被称之为黑箱复用,类以外的对象无法获取实现的细节。合成复用原则就是在一个新的对象里通过关联关系(包括组合...原创 2020-05-20 23:57:04 · 148 阅读 · 0 评论 -
一、06【设计原则】之迪米特法则
今天的博客主题 设计模式——》设计原则之迪米特法则迪米特原则 LoD (Law of Demeter )迪米特法则又叫最少知道原则 LKP (Least Knowledge Principle)就是尽量降低类与类之间的耦合。一个对象应该对其他对象保持最少知道原则。迪米特原则主要强调只和朋友说话,不和陌生人说话。一般出现在成员变量,方法的输入,输出参数中的类都可以称之为成员朋友类,出现在方法体内部的类不属于朋友类。场景领导想知道目前商城正在销售的手机类...原创 2020-05-20 23:54:31 · 277 阅读 · 0 评论 -
一、05【设计原则】之依赖倒置原则
今天的博客主题 设计模式——》设计原则之依赖倒置原则依赖倒置原则 DIP (Dependence Inversion Principle )是说在设计代码结构的时候,高层模块不应该依赖底层模块,二者都应该依赖于抽象。抽象不依赖细节,细节依赖于抽象。这样可以减少类与类之间的耦合性,能提高系统的稳定性,提高代码可读性与可维护性,降低修改程序造成的风险。代码示例===》比如销售人员销售手机,新建一个销售类public class Sale { ...原创 2020-05-20 23:51:19 · 124 阅读 · 0 评论 -
一、04【设计原则】之里氏替换原则
今天的博客主题 设计模式——》设计原则之里氏替换原则里氏替换原则 LSP (Liskov Substitution Principle)任何基类可以出现的地方,子类一定可以出现。里氏替换原则是继承复用的基石,只有当衍生类可以替换掉基类,基类的功能不收影响,基类才能真正被复用,衍生类也能够在基类的基础上增加新的行为。这样说很笼统,简单说就是子类可以扩展父类功能,但不能改变父类的功能,子类可以新增功能。这是在讲开闭原则时候的一段代码,仔细看代码会发现,这里违背了里式替换原...原创 2020-05-20 23:46:47 · 218 阅读 · 0 评论 -
一、03【设计原则】之接口隔离原则
今天的博客主题 设计模式——》设计原则之接口隔离原则接口隔离原则 ISP (Interface Segregation Principle)客户端不应该依赖它不需要的接口。使用多个专门的接口比使用单一的总接口要好。一个类对另一个类的依赖性应当建立在最小的接口上。细化接口,接口中的方法尽量少(适度即可)接口的隔离原则符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。在设计接口的时候,要多去思考,考虑业务模型,以及在以后需求变更的...原创 2020-05-20 23:43:42 · 146 阅读 · 0 评论 -
一、01【设计原则】之开闭原则
今天的博客主题 设计模式——》设计原则之开闭原则开闭原则 OCP (Open-Closed Principle)开闭原则指的是软件实体(一个类、方法、模块)对扩展和修改两个行为上的一个原则。具体就是 对扩展开放、对修改关闭特别强调的是用抽象构建框架、用实现扩展细节。这样可以提高软件系统的可复用性、可维护性。开闭原则 是面向对象设计原则中最基础的设计原则。指导我们如何建立出一个稳定灵活的系统。找一个现实生活中的例子来描述下 开闭原则eg:盖房子,地基是关闭...原创 2020-05-20 23:39:05 · 236 阅读 · 0 评论 -
一、02【设计原则】之单一职责原则
今天的博客主题 设计模式——》设计原则之单一职责原则单一职责原则 SRP (Simple Responsibility Pinciple)单一职责是说不要因为有多种变化原因而导致类变更。怎么说呢,就是一个类负责两个任务,一个任务变更,修改这个任务逻辑代码,有可能会导致另一个任务发生意外。这样一来,那这个类就存在两个导致类变更的原因。如何解决这个问题呢?那就给这两个任务分开,分到两个类里面去,进行解耦。后期任务变更互不影响。达到了降低类的复杂度,提高类的可读性,提...原创 2020-05-20 23:34:15 · 174 阅读 · 0 评论 -
一、00【设计原则】之前言总结
今天的博客主题 设计模式——》设计原则之前言总结学习设计原则是学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。SOLID原则单一职责原则 (Single Responsibility Principle)开闭原则 (Open-closed Principle)里氏替换原则 (Liskov Su...原创 2020-05-19 23:46:24 · 3762 阅读 · 0 评论