
设计模式
Jeremy_Lee123
AI Everywhere!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《设计模式》总结
背景:《Design Patterns: Elements of Reusable Object-Oriented Software》(《设计模式:可复用面向对象软件的基础》即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Ga...原创 2019-11-29 23:10:52 · 368 阅读 · 0 评论 -
Java设计模式之回调函数
严格来说,回调函数并不属于23种设计模式中的任何一种。但是,回调函数在微服务中的使用越来越多,所以今天再来总结复习一下。回调的意义在于,通过在其他对象中调用自身类中定义的函数,达到一定的目的(常见于事件注册,监听以及线程Runnable中的run)。一、模块间调用在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种:(1)同步调用同步调用是最...原创 2019-12-19 23:37:48 · 1803 阅读 · 5 评论 -
UML 类关系--依赖、关联、聚合、组合、泛化
在学习面向对象设计时,类关系涉及依赖<关联<聚合<组合<泛化这五种关系,耦合度依次递增。关于耦合度,可以简单地理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强。参考博文《设计模式中类的关系》,书上对这四种关系的定义:依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Pe...原创 2019-12-01 14:36:55 · 2642 阅读 · 0 评论 -
设计模式六大原则之单一职责原则
单一原则(Single Responsibility Principle):一个类只负责一项职责,尽量做到类的只有一个行为原因引起变化;问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。 解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修...原创 2019-11-25 22:40:12 · 542 阅读 · 0 评论 -
设计模式六大原则之里氏替换原则
这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。里氏替换原则(LSP liskov substitution principle):子类可以扩展父类的功能,但不能改变原有父类的功能;定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P ...原创 2019-11-25 22:49:51 · 476 阅读 · 0 评论 -
设计模式六大原则之依赖倒置原则
依赖倒置原则(dependence inversion principle):面向接口编程;(通过接口作为参数实现应用场景)定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子...原创 2019-11-25 22:54:57 · 536 阅读 · 0 评论 -
设计模式六大原则之接口隔离原则
接口隔离(interface segregation principle):建立单一接口;(扩展为类也是一种接口,一切皆接口)定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。 解决方案:将臃肿的接口I拆分为独立的几...原创 2019-11-25 23:12:44 · 495 阅读 · 0 评论 -
设计模式六大原则之迪米特法则(最少知道原则)
迪米特原则(law of demeter LOD):最少知道原则(LeastKnowledge Principle 简写LKP),尽量降低类与类之间的耦合;定义:一个对象应该对其他对象保持最少的了解。最早是在1987年由美国Northeastern University的Ian Holland提出。问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。...原创 2019-11-25 23:19:59 · 774 阅读 · 0 评论 -
设计模式六大原则之开闭原则
开闭原则(open closed principle):用抽象构建架构,用实现扩展原则;(总纲)定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。 解决方案:当软件需要变化时,尽量通过扩展软件实体...原创 2019-11-25 23:24:03 · 1219 阅读 · 0 评论 -
创建型模式(1)--单例模式Singleton
单例模式:确保某一个类只有一个实例,并且提供一个全局访问点。单例模式具备典型的3个特点:私有的构造方法 —— 不可继承,也不可new出对象 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法单例模式的主要优点就是节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。也许就是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有...原创 2019-11-29 23:15:20 · 510 阅读 · 0 评论 -
创建型模式(2)--工厂方法模式Factory method
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”...原创 2019-11-29 23:15:51 · 432 阅读 · 0 评论 -
创建型模式(3)--抽象工厂模式Abstract factory
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。它的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建了,而缺点就在于新增新的行为会比较麻烦,因为当添加一个新的产品对象时,需要更加需要更改接口及其下所有子类。其UML结构图如下...原创 2019-11-29 23:16:39 · 428 阅读 · 0 评论 -
创建型模式(4)--建造者模式Builder
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。适用于那些产品对象的内部结构比较复杂。建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。但是如果某个产品的内部结构过于复杂,将会导致整个系统变得非常庞大,不...原创 2019-11-29 23:17:02 · 421 阅读 · 0 评论 -
创建型模式(5)--原型模式Prototype
原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。它主要应用与那些创建新对象的成本过大时。它的主要优点就是简化了新对象的创建过程,提高了效率,同时原型模式提供了简化的创建结构。UML结构图:原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Clo...原创 2019-11-29 23:17:40 · 521 阅读 · 0 评论 -
结构型模式(1)--适配器模式Adapter
适配器模式:将一个类的接口,转换成客户期望的另一个接口。在我们的应用程序中我们可能需要将两个不同接口的类来进行通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器。它可以让原本两个不兼容的接口能够无缝完成对接。作为中间件的适配器将目标类和适配者解耦,增加了类的透明性和可复用性。适配器模式包含如下角色:Target:目标抽象类 Adap...原创 2019-11-29 23:52:22 · 376 阅读 · 0 评论 -
结构型模式(2)--桥接模式Bridge
桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。桥接(Bridge)模式的优点是:由于抽象与实现分离,所以扩展能力强; 其实现细节对客户透明。缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。桥接模式通常适用于以下场景。当一个类存在...原创 2019-11-29 23:53:29 · 611 阅读 · 0 评论 -
结构型模式(3)--组合模式Composite
组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。它定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。在使用组合模式中需要注意一点也是组合模式...原创 2019-11-29 23:54:45 · 555 阅读 · 0 评论 -
结构型模式(4)--装饰模式Decorator
装饰(Decorator):指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。装饰(Decorator)模式的主要优点有:采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。继承,装饰者...原创 2019-11-29 23:55:39 · 636 阅读 · 0 评论 -
结构型模式(5)--外观模式Facade
外观(Facade)模式:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。 对...原创 2019-11-30 00:01:33 · 573 阅读 · 0 评论 -
结构型模式(6)--亨元模式Flyweight
享元(Flyweight)模式:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式的主要优点是:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。其主要缺点是:为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。...原创 2019-11-30 00:01:38 · 443 阅读 · 0 评论 -
结构型模式(7)--代理模式Proxy
代理模式:就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。代理模式包含如下角色:Subject: 抽象主题角色 P...原创 2019-11-30 00:01:43 · 570 阅读 · 0 评论 -
行为型模式(1)--责任链模式Chain of responsibility
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。解释:职责链模式描述的请求如何沿着对象所组成的链来传递的。它将对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它...原创 2019-11-30 17:33:52 · 749 阅读 · 0 评论 -
行为型模式(2)--命令模式Command
命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。有些时候我们想某个对象发送一个请求,但是我们并不知道该请求的具体接收者是谁,具体的处理过程是如何的,们只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封装成对象的我们称之为命令模式。所以命令模式将请求封装成...原创 2019-11-30 17:35:12 · 427 阅读 · 0 评论 -
行为型模式(3)--解释器模式Interpreter
所谓解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。解释器模式包含如下角色:AbstractExpression: 抽象表达式 TerminalExpression: 终结符表达式 No...原创 2019-11-30 17:36:52 · 533 阅读 · 0 评论 -
行为型模式(5)--中介者模式Mediator
租房各位都有过的经历吧!在这个过程中中介结构扮演着很重要的角色,它在这里起到一个中间者的作用,给我们和房主互相传递信息。在外面软件的世界里同样需要这样一个中间者。在我们的系统中有时候会存在着对象与对象之间存在着很强、复杂的关联关系,如果让他们之间有直接的联系的话,必定会导致整个系统变得非常复杂,而且可扩展性很差!在前面我们就知道如果两个类之间没有不必彼此通信,我们就不应该让他们有直接的关联关系,...原创 2019-11-30 17:40:03 · 472 阅读 · 0 评论 -
行为型模式(4)--迭代器模式Iterator
对于迭代在编程过程中我们经常用到,能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式,这就是迭代器模式的设计动机。在我们实际的开发过程中,我们可能会需要根据不同的需求以不同的方式来遍历整个对象,但是我们又不希望在聚合对象的抽象接口中充斥着各种不同的遍历操作,于是我们就希望有某个东西能够以多种不同的方式来遍历一个聚合对象,这时迭代器模式出现了。何为迭代器模式?所谓迭代器模式就是提供一...原创 2019-11-30 17:38:02 · 601 阅读 · 0 评论 -
行为型模式(7)--观察者模式Observer
观察者(Observer)模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。...原创 2019-12-01 00:02:46 · 429 阅读 · 0 评论 -
行为型模式(6)--备忘录模式Memento
后悔药人人都想要,但是事实却是残酷的,根本就没有后悔药可买,但是也不仅如此,在软件的世界里就有后悔药!备忘录模式就是一种后悔药,它给我们的软件提供后悔药的机制,通过它可以使系统恢复到某一特定的历史状态。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它实现了对信息的封装,使得客户不需要关心状态保存的细节。保...原创 2019-11-30 17:41:19 · 459 阅读 · 0 评论 -
行为型模式(8)--状态模式State
在很多情况下我们对象的行为依赖于它的一个或者多个变化的属性,这些可变的属性我们称之为状态,也就是说行为依赖状态,即当该对象因为在外部的互动而导致他的状态发生变化,从而它的行为也会做出相应的变化。对于这种情况,我们是不能用行为来控制状态的变化,而应该站在状态的角度来思考行为,即是什么状态就要做出什么样的行为。这个就是状态模式。所以状态模式就是允许对象在内部状态发生改变时改变它的行为,对象看起来好...原创 2019-12-01 00:02:57 · 470 阅读 · 0 评论 -
行为型模式(9)--策略模式Strategy
策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。所以策略模式就是定义了算法族,分别封装起来,让他们之前可以互相转换,此模式然该算法的变化独立于使用算法的客户。在策略模式中它将...原创 2019-12-01 00:03:05 · 592 阅读 · 0 评论 -
行为型模式(10)--模板模式Template method
有些时候我们做某几件事情的步骤都差不多,仅有那么一小点的不同,在软件开发的世界里同样如此,如果我们都将这些步骤都一一做的话,费时费力不讨好。所以我们可以将这些步骤分解、封装起来,然后利用继承的方式来继承即可,当然不同的可以自己重写实现嘛!这就是模板方法模式提供的解决方案。所谓模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,...原创 2019-12-01 00:03:20 · 409 阅读 · 0 评论 -
行为型模式(11)--访问者模式Visitor
访问者模式俗称23大设计模式中最难的一个。除了结构复杂外,理解也比较难。在我们软件开发中我们可能会对同一个对象有不同的处理,如果我们都做分别的处理,将会产生灾难性的错误。对于这种问题,访问者模式提供了比较好的解决方案。访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作...原创 2019-12-01 00:03:35 · 504 阅读 · 0 评论