设计模式
文章平均质量分 78
PigeonEssence
不想当架构师的全栈不是好java boy!
展开
-
《设计模式入门》 设计原则
设计原则(design principle)是2018年由全国科学技术名词审定委员会公布的计算机科学技术名词。在进行软件系统设计时所要遵循的一些经验准则,应用该准则的目的通常是为了避免某些经常出现的设计缺陷。实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。1.开闭原则(Open Close Principle):开闭原则规定了,一个软件实体,如类,模块和函数应该对外扩展开放,对内修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个原创 2022-03-21 09:20:36 · 187 阅读 · 0 评论 -
设计模式入门总目录
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。大概总结了一下GOF的23种设计模式,并且将每一种设计模式加入代码进行说明,希望更加方便理解和以后的查阅。一般总体来说GOF设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、原创 2022-03-18 17:46:45 · 707 阅读 · 4 评论 -
《设计模式入门》 24.解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。解释器模式一般分为五类:抽象解释器(AbstractExpression):具体的解释任务由各个实现类完成。 终结符表达式(TerminalExpression):实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结表达式,但有多个实例,对应不同的终结符。 非终结符表达式(原创 2022-03-18 17:05:44 · 106 阅读 · 0 评论 -
《设计模式入门》 23.中介者模式
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。我们接触最多的情况就比如是在ORM框架中,中间层负责了应用层与数据库层的交互,将应用层与数据库层解耦,比如mybaties的应用。中介者模式一般分类四类:抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List原创 2022-03-18 16:00:07 · 530 阅读 · 0 评论 -
《设计模式入门》 22.访问者模式
访问者模式就是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离。简单来说就是我们可以通过不同的访问者的身份进行区分,然后让他们看到自己想看到的东西,或者我们想让他们看到的东西。访问者模式包含以下主要角色:抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具原创 2022-03-18 15:22:57 · 489 阅读 · 0 评论 -
《设计模式入门》 21.备忘录模式
备忘录模式就是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。我们在很多地方可以看到版本快照,很多都是使用的备忘录模式来进行版本的管理。备忘录模式一般分为三个大类:发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给原创 2022-03-17 17:32:28 · 1213 阅读 · 0 评论 -
《设计模式入门》 20.状态模式
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。简单理解,就是一个拥有状态的context对象,在不同的状态下,其行为会发生改变。比如我们见得最多的,就是线程的状态:多线程存在 5 种状态,分别为新建状态、就绪状态、运行状态、阻塞状态和死亡状态,各个状态当遇到相关方法调用或事件触发时会转换到其他状态 ,这就是状态模式的一个经典应用。一般来说,状态模式分为三类:抽象状态角色(State):接口或抽象类,负责对象状态定义,并且封装环境角色以实现状原创 2022-03-17 15:13:30 · 432 阅读 · 0 评论 -
《设计模式入门》 19.命令模式
命令模式就是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。一般命令模式由四类组成:抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。 具体命令角色(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是原创 2022-03-16 15:36:59 · 213 阅读 · 0 评论 -
《设计模式入门》 18.责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦,请求沿着责任链传递,直到有一个对象处理了它为止。责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递,所以责任链将请求的发送者和请求的处理者解耦了。一般来说,责任链模式由三类构成:抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。 具体处理者原创 2022-03-16 13:24:00 · 422 阅读 · 0 评论 -
《设计模式入门》 17.迭代器模式
迭代器模式就是提供一种方法,顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。也就是说可以让我们以相同的方式,遍历不同的数据结构元素,这些数据结构包括;数组、链表、树等,而用户在使用遍历的时候并不需要去关心每一种数据结构的遍历处理逻辑,从让使用变得统一易用。不同种类的对象可能需要不同的遍历方式,所以我们对每一种类型的对象配一个迭代器,最后把多个迭代器合成一个进行调用。一般,迭代器模式分为四个角色:迭代器角色(Iterator):定义遍历元素所需要的方法,一般...原创 2022-03-14 17:30:44 · 550 阅读 · 0 评论 -
《设计模式入门》 16.观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。也就是就是当一个行为发生时传递信息给另外一个用户接收做出相应的处理,但是两者之间没有直接的耦合关联。观察者模式一般分为4类:抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。原创 2022-03-10 17:36:09 · 566 阅读 · 4 评论 -
《设计模式入门》 15.模板模式
模板模式就是父类模板定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。模板这种东西我们在很多地方都会有接触。比如常用的freemaker就是经典的模板,我们可以简单的理解成,我们先规定一个大的框架,相当于爸爸把儿子的路安排的明明白白,单儿子能把这条路走成什么样,就要看儿子自己的造化了。模板模式一般分为两类 :抽象父类(AbstractClass):实现了模板方法,定义了算法的骨架。 具体类(C...原创 2022-03-10 14:35:47 · 209 阅读 · 0 评论 -
《设计模式入门》 14.策略模式
策略模式定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。也就是可以解决一堆ifelse难以维护的问题。如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为,然后我们对具体行为进行包装,对用户提供行为接口,一方面对我们的内部算法进行了保密封装,另一方面减少了用户端的if-else判断。一般策略模式分为三类:抽象策略角色: 这个是一个抽象的角色,通常情况下使用接口或者抽象类去原创 2022-03-09 16:29:24 · 214 阅读 · 0 评论 -
《设计模式入门》 13.享元模式
享元模式(Flyweight Pattern)就是通过共享的方式高效的支持大量细粒度的对象。一般情况下,享元模式应用于在有大量对象时,有可能会造成内存溢出的情况。我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。一般来说享元模式的结构有两个要求: 内部状态指对象共享出来的信息,存储在享元信息内部,并且不回随环境的改变而改变; 外部状态指对象得以依赖的一个标记,随环境的改变而改变,不可共享。 在JAVA中,这也是很常见的一种模式了,在ja原创 2022-03-08 16:48:15 · 247 阅读 · 0 评论 -
《设计模式入门》 12.组合模式
组合模式有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。也就是说这种把相似对象(也可以称作是方法)组合成一组可被调用的结构树对象的设计思路叫做组合模式。讨论组合模式,我们一般会讨论决策树。也就是说我们一般可以把组合模式看成一个链接组织起来的结构树,这种模式一般在结构树的解决方案用的非常多。一般组合模式由三个角色构成:抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,原创 2022-03-08 10:17:52 · 272 阅读 · 0 评论 -
《设计模式入门》 11.桥接模式
桥接模式简单来说就是将抽象部分与它的实现部分分离,使它们都可以独立地变化。一些组合中如果有如果每一个类都实现不同的服务可能会出现笛卡尔积,而使用桥接模式就可以非常简单的将抽象化与实现化脱耦,使得二者可以独立地变化。怎么理解呢,假设我们有一个支付订单的任务,我们可以通过支付宝和微信支付来实现支付,支付宝和微信支付又分别对应了人脸识别和指纹识别。支付方式和验证方式可以两两对应,这时候的选择就产生了笛卡尔积:支付宝+人脸,支付宝+指纹,微信+人脸,微信+指纹。随着支付方式和验证方式的增加,我们产生的笛原创 2022-03-07 10:05:28 · 348 阅读 · 0 评论 -
《设计模式入门》 10.外观模式
外观模式也叫门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。门面模式又称为外观模式,它是一种对象结构型模式。简单来说就是隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口,让客户可以更简单的使用这个系统。这个模式中,一般存在3个角色。门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客...原创 2022-03-04 16:54:18 · 278 阅读 · 0 评论 -
《设计模式入门》 9.代理模式
代理模式可以说是我们在java学习中非常常见的一个设计模式了,在很多地方我们都可以看到代理模式的影子。比如:Spring 的 Proxy 模式(AOP编程 )AOP的底层机制就是动态代理 mybatis中执行sql时mybatis会为mapper接口通过jdk动态代理的方法生成接口的实现类 Feign对于加了@FeignClient 注解的类会在Feign启动时,为其创建一个本地JDK Proxy代理实例,并注册到Spring IOC容器可以看出,代理模式就是给...原创 2022-03-04 13:32:45 · 487 阅读 · 0 评论 -
《设计模式入门》 8.装饰器模式
装饰器模式主要用于对象的功能扩展。我们使用装饰类动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。装饰器的核心就是再不改原有类的基础上给类新增功能,并且不改变原有类。一般我们提到对象功能扩展,很大一部分都会联想到使用继承,或者AOP的方式。我们使用装饰器模式来设计程序,不仅能避免AOP的复杂,还能解决继承不断横向扩展导致子类膨胀的问题,我们不在考虑大量子类的维护了。装饰模式一共有四部分组成:抽象组件角色(Component):定义一个对象接口,以规范准备接受附...原创 2022-03-02 10:42:19 · 263 阅读 · 0 评论 -
《设计模式入门》7.适配器模式
适配器模式的主要作用就是把原本不兼容的接口,通过适配修改做到统一。比如美版和港版电脑的插头与国行不一样,所以我们需要更换电源适配器,或者增加一个转换插头来解决问题。适配器模式一般分为三种:1.类适配器模式:将一个类转换成满足另一个新接口的类创建一个新类,继承原有的类,实现新的接口2.对象适配器模式:将一个对象转换成满足另一个新接口的对象创建一个Wrapper类,持有原类的一个实例,在Wrapper类中调动实例的方法3.接口适配器模式:当不希望实现一个接口中所有的方法时原创 2022-03-01 16:18:49 · 255 阅读 · 0 评论 -
《设计模式入门》6.原型模式
一般我们对于原型模式的定义就是:用原型实例指定创建对象的种类并且通过拷贝这些原型对象创建新的对象。简单来说就是一个deep copy。所以我们再讨论原型模式之前,先讨论一下拷贝。=========================================================================拷贝一般在java的拷贝中,分为深拷贝(DeepCopy)和浅拷贝(ShallowCopy)。浅拷贝:将一个对象拷贝后,基本数据类型的变量都会重新创建,而引原创 2022-02-28 17:26:01 · 306 阅读 · 0 评论 -
《设计模式入门》 5.建造者模式
造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。 简单来说,假设我们需要装电脑主机,都是电脑但是配置可能不同,有的人光追,有的人想要AMD全家桶。那我们需要的就是创建电脑这个对...原创 2022-02-28 11:30:17 · 350 阅读 · 0 评论 -
《设计模式入门》 4.单例模式
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。单例模式主要有两种类型: 懒汉式:在真正需要使用对象时才去创建该单例类对象 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用 除此之外还有登记式等形式针对特定的业务场景,但没有前两种常用。====================================原创 2022-02-24 16:12:58 · 462 阅读 · 0 评论 -
《设计模式入门》 3.抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。抽象工厂模式和工厂方法模式类似都是由四部分组成: 抽象工厂(AbstractFactory)角色:担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现。所有的具体工厂必须实现这个Java接口或继承这个抽象的Java类。 具体工厂(F...原创 2022-02-18 16:26:30 · 138 阅读 · 0 评论 -
《设计模式入门》 2.工厂方法模式
工厂方法模式(Factory Method Pattern)又称为工厂模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。简单来说就是我们不去直接生成对应的具体产品,而是把生产产品的功能交给工厂,我们只需要给工厂下订单就好了。工厂方法模式一般分为四个部分:抽象工厂(AbstractCreator)角色:担任这个角色的是工厂方法模式的核心,原创 2022-02-14 15:42:26 · 117 阅读 · 0 评论 -
《设计模式入门》 1.简单工厂模式
简单工厂模式(Simple Factory Pattern)不属于GoF 23种设计模式,我们通常将它作为学习其他工厂模式的入门。是由一个工厂对象决定创建出哪一种产品类的实例。简单来说就是我们抽取一个产品的大类,用具体的产品继承大类并且实现具体的方法。简单工厂模式一般抽象为三个板块: 1.工厂类工厂类是简单工厂模式的核心,一般由一个具体的Java类进行实现,工厂类会在客户端的调用下创建具体的产品对象。2.抽象类抽象类一般都是产品类的父类,或者是共同拥有的接口,可以使用一个...原创 2022-02-14 10:26:02 · 424 阅读 · 0 评论