![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 87
Filwaod
写bug的小厂打工人
展开
-
工厂+策略+责任链+模板方法设计模式重构审单流程实战
工厂+策略+责任链+模板方法设计模式重构审单流程实战原创 2023-06-21 11:22:34 · 334 阅读 · 0 评论 -
23种设计模式总览
23 种经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型。原创 2023-04-07 09:33:00 · 461 阅读 · 0 评论 -
面向对象常用7大设计原则
面向对象设计原则,出处不详,具体也不知道有多少种,介绍常用的七个设计原则原创 2022-12-20 16:25:41 · 371 阅读 · 0 评论 -
访问者模式
在具体的元素对象中实现accept方法的时候,会回调访问者的visit方法,等于请求被第二次分发了,请求被分发给访问者来进行处理,真正实现功能的正是访问者的 visit方法。仔细思考访问者模式,它的实现主要是通过预先定义好调用的通路,在被访问的对象上定义accept方法,在访问者的对象上定义 visit方法;不适用于对象结构中的类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者的实现都要发生相应的改变,代价太高。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。原创 2022-12-20 15:10:27 · 1669 阅读 · 0 评论 -
桥接模式
如果你不希望在抽象部分和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象部分和实现部分分开,然后在程序运行期间来动态地设置抽象部分需要用到的具体的实现,还可以动态地切换具体的实现。由于桥接模式把抽象部分和实现部分分离开了,所以在实现桥接的时候,就可以实现动态的选择和使用具体的实现。如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。桥接模式的本质:分离抽象和实现。原创 2022-12-20 11:08:29 · 425 阅读 · 0 评论 -
责任链模式
这种情况可以使用职责链模式,把处理请求的对象实现成为职责对象,然后把它们构成一个职责链,当请求在这个链中传递的时候,具体由哪个职责对象来处理,会在运行时动态判断。职责链模式会把功能处理分散到单独的职责对象中,也就是每个职责对象只处理一个方面的功能,要把整个业务处理完,需要很多职责对象的组合,这样会产生大量的细粒度职责对象。职责链模式会把功能处理分散到单独的职责对象中,然后在使用的时候,可以动态组合职责形成职责链,从而可以灵活地给对象分配职责,也可以灵活地实现和改变对象的职责。职责链模式有以下优点。原创 2022-12-19 21:12:08 · 1979 阅读 · 0 评论 -
装饰器模式
装饰模式把一系列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,使实现装饰器变得简单,更重要的是这样有利于装饰器功能的复用,可以给一个对象增加多个同样的装饰器,也可以把一个装饰器用来装饰不同的对象,从而实现复用装饰器的功能。前面说了,装饰模式是把一系列复杂的功能,分散到每个装饰器当中,一般一个装饰器只实现一个功能,这样会产生很多细粒度的对象,而且功能越复杂,需要的细粒度对象越多。总之,装饰模式是通过把复杂功能简单化、分散化,然后在运行期间,根据需要来动态组合的这样一个模式。原创 2022-12-19 15:07:33 · 981 阅读 · 1 评论 -
解释器模式
如果语法特别复杂,构建解释器模式需要的抽象语法树的工作是非常艰巨的,再加上有可能会需要构建多个抽象语法树。在使用解释器模式的时候,还有两个特点需要考虑,一个是语法相对应该比较简单,太复杂的语法不适合使用解释器模式;扩展了新的语法,只需要创建相应的解释器对象,在创建抽象语法树的时候使用这个新的解释器对象就可以了。对于解释器的实现来讲,功能就变得比较简单,只需要考虑这一条语法规则的实现就可以了,其他的都不用管。解释器模式的核心思想是:定义一种文法,并定义一个解释器,使用该解释器来解释这个文法。原创 2022-12-18 19:22:41 · 713 阅读 · 0 评论 -
享元模式
分离的是对象状态中变与不变的部分,共享的是对象中不变的部分。享元模式的关键之处就在于分离变与不变,把不变的部分作为享元对象的内部状态,而变化部分则作为外部状态,由外部来维护,这样享元对象就能够被共享,从而减少对象数量,并节省大量的内存空间。从上面结果可以发现,网站其实只有3种类型(博客、新闻发布、公众号),只是归属不同的客户,那么可以拆分,将网站类型作为内部状态,客户作为外部状态,再改造。上面创建三个博客类型的网站,但是好像这三个网站就是一模一样的,但是不同的客户,所以加上网站归属用户,再改造。原创 2022-12-14 16:22:22 · 1498 阅读 · 0 评论 -
备忘录模式
如果需要保存一个对象的内部状态,但是如果用接口来让其他对象直接得到这些需要保存的状态,将会暴露对象的实现细节并破坏对象的封装性,这时可以使用备忘录模式,把备忘录对象实现成为原发器对象的内部类,而且还是私有的,从而保证只有原发器对象才能访问该备忘录对象。使用备忘录对象来封装和保存需要保存的内部状态,然后把备忘录对象保存到管理者对象中,在需要的时候,再从管理者对象中获取备忘录对象,来恢复对象的状态。备忘录模式备忘的就是原发器对象的内部状态,这些内部状态是不对外的,只有原发器对象才能够进行操作。原创 2022-12-14 11:02:44 · 2326 阅读 · 1 评论 -
状态模式
虽然分离开了,但状态和行为是有对应关系的,可以在运行期间,通过改变状态,就能够调用到该状态对应的状态处理对象上去,从而改变对象的行为。状态模式通过设置所有状态类的公共接口,把状态和状态对应的行为分离开,把所有与一个特定的状态相关的行为都放入一个对象中,使得应用程序在控制的时候,只需要关心状态的切换,而不用关心这个状态对应的真正处理。引入了状态处理的公共接口后,使得扩展新的状态变得非常容易,只需要新增加一个实现状态处理的公共接口的实现类,然后在进行状态维护的地方,设置状态变化到这个新的状态即可。原创 2022-12-13 16:46:27 · 306 阅读 · 0 评论 -
策略模式
实际使用各种支付时,各自的参数必然不一样,但是策略又是接口定义好的,那应该怎么办呢,这时介于客户端和策略方法中间的上下文类就发挥作用了,可以在这里面搞点小动作,把微信和支付宝用到的参数声明在这里,然后把自己传给策略类,不同的策略类需要什么参数就取什么参数。根据前面的示例会发现,策略模式的一系列策略算法是平等的,是可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现中又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。策略模式的本质:分离算法,选择实现。原创 2022-12-13 11:19:53 · 1584 阅读 · 0 评论 -
模板模式
事实上模板和子类是非常耦合的,如果要对模板中的算法骨架进行变更,可能就会要求所有相关的子类进行相应的变化。模板方法模式主要是通过制定模板,把算法步骤固定下来,至于谁来实现,模板可以自己提供实现,也可以由子类去实现,还可以通过回调机制让其他类来实现。定义一个oppo手机模板类,所有机型都使用的是oppo电池,但是使用的芯片不同,所以电池方法在模板类实现,芯片方法各个机型实现自己的。通过固定算法骨架来约束子类的行为,并在特定的扩展点来让子类进行功能扩展,从而让程序既有很好的复用性,又有较好的扩展性。原创 2022-12-12 13:59:28 · 306 阅读 · 0 评论 -
组合模式
组合模式通过把叶子对象当成特殊的组合对象看待,从而对叶子对象和组合对象一视同仁,全部当成了Component对象,有机地统一了叶子对象和组合对象。正是因为统一了叶子对象和组合对象,在将对象构建成树型结构的时候,才不需要做区分,反正是组件对象里面包含其他的组件对象,如此递归下去;也才使得对于树形结构的操作变得简单,不管对象类型,统一操作。建议在以下情况中选用组合模式。组合模式有以下优点。定义了包含基本对象和组合对象的类层次结构在组合模式中,基本对象可以被组合成复杂的组合对象,而组合对象又可以组合成更复杂原创 2022-12-04 22:34:45 · 273 阅读 · 0 评论 -
迭代器模式
如果你希望提供访问一个聚合对象的内容,但是又不想暴露它的内部表示的时候,可以使用迭代器模式来提供迭代器接口,从而让客户端只是通过迭代器的接口来访问聚合对象,而无须关心聚合对象的内部实现。一个学院有多个系,计算机学院用数组存的,数学学院用集合存的,其他学院也是有的用数组存,有的用集合存,因为遍历集合和遍历数组的代码不同,遍历所有学院很困难,可以用迭代器模式实现这个效果。聚合对象的类型很多,如果对聚合对象的迭代访问跟聚合对象本身融合在一起的话,会严重影响到聚合对象的可扩展性和可维护性。以计算机学院举例修改。原创 2022-12-02 15:06:02 · 1260 阅读 · 0 评论 -
命令模式
将这些操作功能的请求封装成命令对象,然后实现日志命令,就可以在系统恢复以后,通过日志获取命令列表,从而重新执行一遍功能。由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。在需要事务的系统中,可以选用命令模式。原创 2022-11-30 14:09:12 · 1075 阅读 · 0 评论 -
观察者(订阅)模式
原本目标对象在状态发生改变的时候,需要直接调用所有的观察者对象,但是抽象出观察者接口以后,目标和观察者就只是在抽象层面上耦合了,也就是说目标只是知道观察者接口,并不知道具体的观察者的类,从而实现目标类和具体的观察者类之间解耦。如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变,这种情况可以选用观察者模式,被更改的那一个对象很明显就相当于是目标对象,而需要连带修改的多个其他对象,就作为多个观察者对象了。里面维护了观察者对象,以及注册、移除观察者,通知观察者等。原创 2022-11-29 17:56:39 · 1612 阅读 · 0 评论 -
原型(克隆)模式
原型模式的重心还是在创建新的对象实例,至于创建出来的对象,其属性的值是否一定要和原型对象属性的值完全一样,这个并没有强制规定,只不过在目前大多数实现中,克隆出来的对象和原型对象的属性值是一样的。原型模式可以在运行期间,由客户来注册符合原型接口的实现类型,也可以动态地改变具体的实现类型,看起来接口没有任何变化,但其实运行的已经是另外一个类实例了。克隆是手段,目的是生成新的对象实例。原型模式的客户端只知道原型接口的类型,并不知道具体的实现类型,从而减少了客户端对这些具体实现类型的依赖。原创 2022-11-29 14:08:35 · 1509 阅读 · 0 评论 -
中介者模式
多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那就扩展中介者对象,而各个同事类不需要做修改。中介者模式的一个潜在缺点是,过度集中化。没有使用中介者模式的时候,同事对象之间的关系通常是多对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成了双向的一对多,这会让对象的关系更容易理解和实现。当多个类(对象)耦合严重时,通过中介者模式创建一个中介者,多个类不直接交互了,变成和中介者进行交互,松散耦合。原创 2022-11-28 17:13:10 · 517 阅读 · 0 评论 -
生成器(建造者)模式
虽然在生成器模式的整体构建算法中,会一步一步引导 Builder来构建对象,但这并不是说生成器主要就是用来实现分步骤构建对象的。生成器模式的重心还是在于分离整体构建算法和部件构造,而分步骤构建对象不过是整体构建算法的一个简单表现,或者说是一个附带产物。构建一个复杂的对象,本来就有构建的过程,以及构建过程中具体的实现。生成器模式就是用来分离这两个部分,从而使得程序结构更松散、扩展更容易、复用性更好,同时也会使得代码更清晰,意图更明确。生成器模式的本质:分离整体对象构建算法和对象的部件构造。原创 2022-11-23 17:21:29 · 608 阅读 · 0 评论 -
工厂方法模式
而工厂方法会把这个工作延迟到子类来实现,工厂类里面使用工厂方法的地方是依赖于抽象而不是具体的实现,从而使得系统更加灵活,具有更好的可维护性和可扩展性。工厂方法模式中的工厂方法,在真正实现的时候,一般是先选择具体使用哪一个具体的产品实现对象,然后创建这个具体产品对象的示例,最后就可以返回去了。也就是说,工厂方法本身并不会去实现产品接口,具体的产品实现是已经写好了的,工厂方法只要去选择实现就好了。例:一个Cpu抽象工厂,有多个子类,AmdCpu工厂、ItelCpu工厂等等,在子类中具体实现。原创 2022-11-23 09:33:49 · 104 阅读 · 0 评论 -
抽象工厂模式
但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是有联系的,它们都是产品的某一部分或者是相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法了。工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。抽象工厂专注于产品簇的实现,主要是那些有关联关系的,如果只有一个产品的话就退化成了工厂方法模式。抽象工厂模式的本质:选择产品簇的实现。建议在以下情况中选用抽象工厂模式。原创 2022-11-22 20:28:09 · 606 阅读 · 0 评论 -
适配器模式
适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么。在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。适配器模式通过转换已有的接口,达成目标需要的接口。建议在以下情况中选用适配器模式。原创 2022-11-16 20:54:54 · 293 阅读 · 0 评论 -
外观(门面)模式
当系统内部多个模块发生变化的时候,这个变化可以被这个外观类吸收和消化,并不需要影响到客户端,换句话说就是:可以在不影响客户端的情况下,实现系统内部的维护和扩展。如果不使用外观模式,客户端通常需要和子系统内部的多个模块交互,也就是说客户端会有很多的朋友,客户端和这些模块之间都有依赖关系,任意一个模块的变动都可能会引起客户端的变动。使用外观模式后,客户端只需要和外观类交互,也就是说客户端只有外观类这一个朋友,客户端就不需要去关心子系统内部模块的变动情况了,客户端只是和这个外观类有依赖关系。原创 2022-11-15 21:42:51 · 310 阅读 · 0 评论 -
简单工厂模式
如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,—个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。接口的本质就是不想让用户看到具体实现,而直接使用多态new对象,用户就能知道接口的实现类是哪个,所以使用简单工厂,对外提供一个方法,具体调用哪个实现类用户就看不到了。如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。简单工厂的本质是:选择实现。原创 2022-11-15 21:23:27 · 125 阅读 · 0 评论 -
工厂模式
文章目录工厂模式1.简单工厂模式(静态工厂模式)2.工厂方法模式3.抽象工厂模式工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。1.简单工厂模式(静态工厂模式)Car接口public interface Car { void name();}Dazhong实现类public cl原创 2021-04-06 15:40:50 · 159 阅读 · 1 评论 -
代理模式
代理模式通过代理目标对象,把代理对象插入到客户和目标对象之间,从而为客户和目标对象引入一定的间接性。正是这个间接性,给了代理对象很多的活动空间。代理对象可以在调用具体的目标对象前后,附加很多操作,从而实现新的功能或是扩展目标对象的功能。更狠的是,代理对象还可以不去创建和调用目标对象,也就是说,目标对象被完全代理掉了,或是被替换掉了。需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理。需要按照需要创建开销很大的对象的时候,可以使用虚代理。代理模式的本质:控制对象访问。原创 2021-03-28 09:55:38 · 140 阅读 · 0 评论 -
单例模式
单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。饿汉式//饿汉式//如果没有使用,也实例化了对象,浪费内存public class HungryMan { private static HungryMan hungryMa原创 2021-03-28 09:52:58 · 142 阅读 · 0 评论