设计模式
文章平均质量分 81
Andy阿辉
微信公众号@Andy阿辉 ,讲述工作、生活、技术中的日常与感悟。
展开
-
【设计模式】访问者
访问者模式介绍访问者模式能将算法与其所作用的对象隔离开来。访问者模式建议将新行为放入要给名为访问者的独立类中,而不是试图将其整合到已有类中。它允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。需要执行操作的原始对象将作为参数被传递给访问者中的方法,让方法能访问对象所包含的一切必要数据。简单理解下什么是访问者,这里使用保险代理人拜访不同层次的客户时为例子。他会根据不同的客户,推荐不同的保单。普通农民工,推荐医疗保险。普通打工人,推荐医疗保险和财产保险。企业家,推荐理财保原创 2021-08-20 23:19:55 · 78 阅读 · 0 评论 -
【设计模式】模板方法模式
模板方法介绍模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板方法模式建议将算法分解为一系列步骤,然后将这些步骤改为方法,最后在“模板方法”中依次调用这些方法。步骤可以是抽象的,也可以有一些默认的实现。为了能够使用算法,客户端需要自行提供子类并实现所有的抽象步骤(有时候还需要重写步骤)。模板方法将算法分解为步骤,并允许子类重写这些步骤,而非重写实际的模板方法。分解步骤1、抽取步骤必须由各个子类来实现;2、可选步骤已有一些默认原创 2021-08-19 23:14:19 · 181 阅读 · 0 评论 -
【设计模式】策略
策略模式介绍策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。策略模式建议找出负责用许多不同方式完成特定任务的类,然后将其中的算法抽取到一组被称为策略的独立类中。它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换,原始对象就叫做上下文,它包含指向策略对象的引用并将执行行为分派给策略对象。为了改变上下文完成其工作的方式,其他对象可以使用另一个对象来替代当前链接的策略对象。它会有一个上下文类来关联策略,通过一个成员变量存储对原创 2021-08-18 23:02:37 · 62 阅读 · 0 评论 -
【设计模式】状态
状态模式介绍状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。状态模式描述的是一个行为下的多种状态变更,比如我们最常见的一个网站的页面,在你登录与不登录时,用户看到的页面是不同的,而这种登录与不登录就是我们通过改变状态而让整个行为发生了变化。状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。原始对象被称为上下文,它并不会自行实现所有行为,而是会保存一个指向表示当前状态对象的引用,且将所有与状态相关的工原创 2021-08-17 23:44:28 · 111 阅读 · 0 评论 -
【设计模式】观察者
观察者模式介绍观察者又名事件订阅者、监听者。观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察者”该对象的其他对象。目标:拥有一些值得关注的状态的对象。发布者:它要自身的状态改变通知其他对象。订阅者:希望关注发布者状态变化的其他对象。观察者模式的发布者类添加订阅机制,每个对象都能订阅或取消订阅发布者事件流。一个用于存储订阅者对象引用的列表成员变量。几个用于添加或删除该列表中订阅者的共有方法。所有订阅者都必须实现同样的接口,发布者仅通过该接口与原创 2021-08-16 22:56:16 · 90 阅读 · 0 评论 -
【设计模式】备忘录
备忘录模式介绍备忘录模式是可以恢复或者说回滚、配置、版本、悔棋为核心功能的设计模式,而这种设计模式属于行为模式。在功能实现上是以不破坏原对象为基础增加备忘录操作类,记录原对象的行为从而实现备忘录模式。备忘录的设计实现方式,重点在于不更改原有类的基础上,增加备忘录存放记录。备忘录允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。备忘录模式将创建状态快照的工作委派给实际状态的拥有者原发器对象,这样其他对象就不再需要从“外部”复制编辑器状态,编辑器类拥有其状态的完全访问权,可自行生成快照。建议将原创 2021-08-16 22:54:55 · 120 阅读 · 0 评论 -
【设计模式】中介者
中介者模式介绍中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。中介者模式顾名思义,可以用我们平时生活中的房产中介去理解。房产中介就是房子拥有者和想买房子人直接的桥梁,不让二者直接交易,通过中介去做桥梁,进行沟通和交易。中介者模式建议你停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象,通过中介者对象重定向调用行为,以间接的方式进行合作。最终,组件仅依赖于一个中介者类,无需与多个组件想耦合。原创 2021-08-15 23:44:12 · 81 阅读 · 0 评论 -
【设计模式系列】迭代器
迭代器模式介绍迭代器模式是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈、树等)的情况下遍历集合中所有的元素。迭代器模式满足了单一职责和开闭原则,外界的调用方也不需要知道任何一个不同的数据结构在使用上的遍历差异。迭代器模式的主要思想是将集合的遍历行为抽取为单独的迭代器对象。除实现自身算法外,迭代器还封装了遍历操作的所有细节,比如当前位置和末尾剩余元素的数量、同时还有提供一个获取集合元素的基本方法。客户端可不断调用该方法直到它不返回任何内容(已遍历所有元素)、所有迭代器必须实现相同的原创 2021-08-15 23:43:32 · 62 阅读 · 0 评论 -
【设计模式系列】责任链
责任链模式介绍责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。责任链模式的核心是解决一组服务中的先后执行处理关系。责任链模式可以让各个服务模块更加清晰,而每一个模块可以通过next的方式进行获取。而每一个next是由继承的统一抽象类实现的,最终所有类的职责可以动态的进行编排使用,编排的过程可以做成可配置化。在使用责任链时,如果场景比较固定,可写死到代码中进行初始化。但如果业务场景经常变化可以做成xml配置的方式原创 2021-08-15 23:42:43 · 101 阅读 · 0 评论 -
【设计模式系列】命令
命令模式介绍命令模式最初的感受是把逻辑实现与操作请求进行分离,降低耦合方便扩展。命令模式是一种行为模式,以数据驱动的方式将命令对象,通过构造函数的形式传递给调用者。调用者再提供相应的实现为命令执行提供操作方法。命令场景的核心的逻辑是调用方不需要去关心具体的逻辑实现,它只管调用它需要的模块,而被调用方也不需要关心被谁调用,它只负责完成模块的实现就行。命令模式的使用场景需要分为三个比较大的块:命令、实现、调用者,而这三块内容的拆分也是选择适合场景的关键因素,经过这样的拆分可以让逻辑具备单一职责的性原创 2021-08-15 23:39:44 · 84 阅读 · 0 评论 -
【设计模式系列】代理
代理模式介绍代理模式 是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。其实说通俗点,就好比我们平时生活中的购买机票,火车票,我们以前的做法是去县上或市区的每一个代理点去购买,你不需要关心代理点的工作人员去哪、购买车票,你只需要给钱说购买的地方,其余的一切都交由他负责。那么在这个购票的过程中,代理点的购票员就相当于是一种代理模式。代理模式最常见的地方就是数据库操作部分,对于数据库的操作很多时候我们都在使用代理的模式来进行,原创 2021-08-11 10:12:44 · 60 阅读 · 0 评论 -
【设计模式系列】享元
享元模式介绍享元模式主要在于共享通用对象,减少内存的使用,提升系统的访问效率。而这部分共享对象通常比较耗费内存或者需要查询大量接口或者使用数据库资源,因此统一抽离作为共享对象使用。在使用此模式过程中,需要使用享元工厂来进行管理这部分独立的对象和共享的对象,避免出现线程安全的问题。享元模式设计的思想:减少内存的使用提升效率,和之前学习的原型模式通过克隆对象的方式生成复杂对象,减少远程系统的调用。享元与不可变性在使用享元模式时,享元对象可在不同情景中是使用,必须确保其状态不可被修改。也就是说享元对象原创 2021-08-11 10:12:00 · 70 阅读 · 0 评论 -
【设计模式系列】外观
外观模式介绍也叫门面模式,主要解决的是降低调用方的使用接口的复杂逻辑组合。有时候也会被用在中间件层,将服务中的通用性的复杂逻辑进行中间件层包装,让使用方可以只关心业务开发。可增强代码的隔离性,以及复用性。对于外观模式的使用通常是用在复杂或多个接口进行包装统一对外提供服务上。说的通俗一点就是:外观模式就是将一些复杂类的众多可供调用的方法或接口进行高度的整合或集成,将其放到一个外部类中,并让其业务方进行调用和使用。就和上面电话购物一样,调用者只需要知道电话号码即可,其余的交给电话导购员,由她们去确认原创 2021-08-11 10:11:09 · 64 阅读 · 0 评论 -
【设计模式系列】装饰器
装饰器模式介绍装饰器的核心就是再不改原有类的基础上给类新增功能。可以避免继承导致的子类过多,可避免AOP带来的复杂性。装饰器主要解决的时直接继承下因功能的不断横向扩展导致子类膨胀的问题,而是用装饰器模式后就会比直接继承显得更加灵活同时这样也就不再需要考虑子类的维护。在实现的过程中,具体实现只关心扩展部分的功能,同时不会影响原有类的核心服务,也不会因为使用继承方式而导致的多余子类,增加了整体的灵活性。装饰器模式满足单一职责原则,可以在自己的装饰类中完成功能逻辑的扩展,而不影响主类,同时可以按需在运行原创 2021-08-11 10:10:36 · 100 阅读 · 0 评论 -
【设计模式系列】组合
组合模式介绍组合模式是把相似对象或方法组合成一组可被调用的结构树对象的设计思路。组合模式不只是可以运用于规则决策树,还可以做服务包装将不同的接口进行组合配置,对外提供服务能力,减少开发成本。组合模式的主要解决的是一系列简单逻辑节点或者扩展的复杂逻辑节点在不同结构的组织下,对于外部的调用是仍然可以非常简单的。组合模式的结构组件 接口描述了树中简单项目和复杂项目所共有的操作。叶节点 是树的基本结构,它不包含子项目。 一般情况下,叶节点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分原创 2021-08-11 10:10:02 · 104 阅读 · 0 评论 -
【设计模式系列】桥接
桥接模式的介绍桥接模式就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合。其实就是在A类中含有B类接口,通过构造函数传递B类的实现,这个B类就是设计的桥。它是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。其实简单说就是将一个复杂类/对象进行拆分,拆分为接口(抽象)和实现,利用接口中的某一实例变量来调用实现的某一块逻辑实现(这个过程最最重要的就是通过构造函数来声明和传递)。桥接模式的结构1、抽象部分:提供高层控制逻辑,原创 2021-08-11 10:09:18 · 72 阅读 · 0 评论 -
【设计模式系列】适配器
适配器模式介绍适配器模式的作用就是把原本不兼容的接口,通过适配修改到统一的过程,使得用户方便使用。在实际工作中, 有时候我们需要把各个业务线的各种类型服务做统一的包装,再对外提供接口进行使用。适配器模式要解决的主要问题就是多种差异化类型的接口做统一输出。适配器可担任两个对象间的封装器,它会接收对于一个对象的调用,并将其转换为另一个对象可识别的格式和接口。适配器模式通过封装对象将复杂的转换过程隐藏于幕后。被封装的对象甚至察觉不到适配器的存在。适配器模式结构对象适配器构成原则:原创 2021-08-11 10:06:39 · 70 阅读 · 0 评论 -
【设计模式系列】单例
单例模式介绍单例模式主要解决的是,一个全局使用的类频繁的创建和消费,从而提升整体代码的性能。在我们平时使用中,要确保一个类只能有一个实例对象,即使多线程同时访问,也只能创建一个实例对象,并需要提供一个全局访问此实例的点。用来创建独一无二的,只能有一个实例对象的入场卷。单例模式允许在程序的任何地方访问特定对象,但是它可以保护该实例不被其他代码覆盖。使用场景:控制某些共享资源的访问权限(连接数据库、访问特殊文件)某些全局的属性或变量想保持其唯一性,可使用程序中的某个类对于所有客户端只有一原创 2021-08-11 10:01:40 · 86 阅读 · 0 评论 -
【设计模式系列】原型
原型模式介绍原型模式主要解决的问题就是创建重复对象,而这部分对象内容本身比较复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。原型模式是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类。原型模式的特点在原型模式中所需要非常重要的手段就是克隆。原型模式的使用频率不是很高。在一个很复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑用原型。便于通过克隆方式创造复杂对象,也可以避免重复做初始化操作,不需要与类中所属原创 2021-08-11 10:00:06 · 67 阅读 · 0 评论 -
[设计模式系列]建造者
建造者(生成器)模式含义:生成器模式是一种创建型模式,使你能够分步奏创建复杂对象。可是使用相同的创建代码生成不同类型和形式的对象。看图我们就能很好地理解,图中就是工厂中的流水线模式,建造者就好比整条流水线,通过流水线上每个装配点的工人将一个个产品零件组装整合成一个完整的产品即可。将对象构造代码从具体产品类中抽取出来,并将其放在一个名为生成器的独立对象中。它可以让你能够分步奏创建复杂对象,不允许其他对象访问正在创建中的产品。利用相同的物料,不同的组装所产生出的具体内容,就是建造者模式的最原创 2021-08-03 23:33:40 · 82 阅读 · 0 评论 -
[设计模式系列]抽象工厂
设计模式之抽象工厂上一篇我们学习了简单工厂,知道简单工厂是创建不同类的地方,那么这些工厂是如何创建得呢?随着我们业务逻辑的增加,可能需要好多这种简单工厂,我们不可能每一个都去主动创建,虽然说这样也可以实现,但是却不优雅而且后期维护者分不清修改重点,导致牵一发而动全身。接下来学习如何创建通过一种方式去创建简单工厂,那么即使需要很多工厂,也可以通过这种方式去创建,减少代码的耦合,使其内聚性更高。抽象工厂与工厂方法都为了解决接口选择问题,但是实现上,抽象工厂是一个中心工厂,用于创建其它工厂的模式。不原创 2021-06-05 23:31:36 · 134 阅读 · 0 评论 -
[设计模式系列] 简单工厂
工厂模式工厂模式:顾名思义就是使得这个类的作用和工厂一样,生产产品,在这里使用,我们就是生产类。工厂模式就是生产类,创建类的模式。其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。代码绑定着具体类会导致代码更脆弱,更缺乏弹性,不易扩展,修改困难。针对接口编程,可以隔离掉以后系统可能发生的一大堆改变,易于扩展。用于处理改变,并帮助我们“找出会变化的方面,把它们从不变的部分分离出来”Demo比如现在有一个物流公司,之前业务很单一,只做陆上物流,随着时间的推移,市场的变化原创 2021-06-03 09:29:37 · 97 阅读 · 0 评论 -
设计模式总览
看到掘金的30天发文连更挑战,想试试自己到底可以连续坚持几天,奖品不奖品的不重要,重在参与吗?接下来的30天里,我将带领大家一起学习设计模式,以前总觉得设计模式很复杂,在一般的常规编程中很少使用到,仔细阅读后发现,之前的想法是多么无知。如果一个编程人员想提升自己,想让自己更加值钱,那么代码规范,设计模式这些术层面的知识点也是需要了解和掌握的。其实在日常的开发中,我们或多或少都会使用到设计模式,只是大家不太清楚而已。比如我们经常使用到的单例模式,工厂模式等。楼主主要从事C#开发,程序中举例的代码使用C#原创 2021-06-01 07:55:21 · 133 阅读 · 0 评论