设计模式
文章平均质量分 90
子云心
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
行为型设计模式(十一) 之 自定义表达式和解析可用解释器模式
1 定义解释器模式(InterpreterPattern)属于行为型设计模式,它主要是为了解决当出现一种特定类型的问题且发生频率足够高时,那么就可以将该类问题的各个实现表述为一个简单的语言句子,然后通过构造一个解释器来解释这些句子来解决问题。这是一种使用了编译语言的思想来分析应用中的实例的行为。通俗些说就是提供一种有语法规则的表达式,然后再设计出一个解释器来解释该表达式的意思。例如现在我们需要实现一个非阿拉伯数字而是可以识别汉字的计算器程序,当传入如“伍加拾壹加捌减六”便可像传入“5+11+8-6”一.原创 2020-11-09 18:01:08 · 660 阅读 · 2 评论 -
行为型设计模式(十) 之 稳定的结构多变的算法使用访问者模式将其分离
1 定义访问者模式(Visitor Pattern)属于行为型设计模式,它主是为了解决在不改变元素对象结构的前提下,接受一个访问者角色,访问者可以进行元素算法的执行,而且算法的执行可以随着访问者的改变而改变,从而使元素中的数据结构和数据算法分离达到松耦合效果。例如在公司部门中,有研发工程师和产品经理两类员工,他们就是上述中的元素,他们接受公司领导的工作报告查阅,领导就是访问者,领导的查阅不会影响到他们原来正常的工作,部门经理或者老板是不同的领导,他们所关心的查阅工作和考核标准是不一样的。2 实现原创 2020-11-04 10:20:35 · 294 阅读 · 0 评论 -
行为型设计模式(九) 之 中介者模式优化多对象的复杂交互
1 定义中介者模式(Mediator Pattern)又叫调停者模式,属于行为型设计模式,它主要用于降低对象间交互的依赖和通讯复杂性,提供了一个中介的角色来封装处理对象间的通讯,将原来多个对象间网状的通讯行为(多个对象相互通讯)改变成为星型通讯行为(每个对象只跟中介交互,中介者再转达),从而达到松耦合效果。例如现实买卖房子双方和房产中介之间的交互,一般情况买方和卖方不直接进行交易,而是通过房产经纪进行信息或者物质的传递。2 基本实现中介者模式一般包含4个角色,分别是:抽象中介(Mediato原创 2020-11-04 10:17:57 · 313 阅读 · 0 评论 -
行为型设计模式(八) 之 备忘录模式实现数据存档
1 定义备忘录模式(Memento Pattern)属于行为型设计模式,它主要用于在不破坏封装性的前提下,捕获一个对象当前内部状态并进行保存,并且在之后需要时从对其进行恢复到原先保存前的状态。另外为了保护被保存的对象状态完整性以及内部实现的封装不对外暴露性,还要保证保存的对象状态不能被外部随意访问。例如现实玩游戏场景中,我们一般会在打大BOSS时对当前游戏数据进行一个备份,如备份到关卡、生命数、装备等信息,万一打不过BOSS挂掉了还可以从备份存档中恢复回来,免得又得从头玩起。2 基本实现备忘录模原创 2020-11-04 10:15:27 · 325 阅读 · 0 评论 -
行为型设计模式(七) 之 命令模式可让行为请求和行为接收解偶
1 定义命令模式(Command Pattern)属于行为型设计模式。它主要是为了解决行为请求者与行为接收者之间的解偶,使用了一系列的请求命令进行封装,避免了请求者与接收者的直接调用,而且命令还可形成序列,接收多个命令后一并转交接收者实现。例如现实场景到饭店吃饭,我们并不会直接跑到厨房跟厨师说要吃什么,而是看好菜单后通过服务员记录好要吃什么菜,然后服务员再将刚才下的单转交到厨房厨师去烹调。2 实现命令模式一般包含4个角色,分别是:抽象命令(Command):用于定义命令的基本属性和命令执行方原创 2020-11-04 10:13:12 · 299 阅读 · 0 评论 -
行为型设计模式(六) 之 广播式的通知是观察者模式
1 定义观察者模式(Observer Pattern)属于行为型设计模式,它主要用于被观察者对象与观察者对象的通讯,被观察者与观察者的关系是一对多的依赖关系,当被观察者状态发生改变时,所有依赖它的观察者都能自动收到改变的通知并做出各自相应的逻辑处理。发布/订阅模式(Publish/Subscribe Pattern)是后来观察者模式的一个进化版,它也可算是观察者模式的一个别称。发布/订阅模式跟观察者模式本质上都是为了解决一个对象跟多个对象的通迅,其最大的区别在于发布者(被观察者)跟订阅者(观察者原创 2020-11-04 10:09:30 · 690 阅读 · 2 评论 -
行为型设计模式(五) 之 模板方法模式是框架最基本的特征
1 定义模板方法模式(Template Method Pattern)又简称模板模式,属于行为型设计模式,它主要是在父类中定义一个统一的操作的算法框架,而将具体实现延迟到子类中,使得不同的子类按照父类已定义好的框架结构进行实现不同的算法细节。这类行为的思想实现也就是控制反转(Inversion of Control,缩写IOC)的体现。例如现实场景中煮饭,所有人都公知同样的步骤:洗米、放水和煮法,不同的人或不同的工具煮出来味道也是会不一样的。2 实现模板方法模式一般包含了2个角色,分别是:抽原创 2020-11-04 10:04:56 · 361 阅读 · 0 评论 -
行为型设计模式(四) 之 迭代器模式可让聚合对象统一遍历
1 定义迭代器模式(Iterator Pattern)属于行为型设计模式,它主要是为了解决在不暴露对象内部表示情况下,提供一种方法可顺序来访问一个聚合对象里的各个元素,简单地说就是为一个聚合对象提供对外可遍历它里内元素的方案。像我们常使用的for语句中,i++每次循环自增迭代到下一个元素,将这种循环变量的作用抽象后通用化就是迭代器模式。正如有些场景下我们并不想关心一个聚合对象内部使用是List、set还是Map的集合存储方式,只想使用统一的遍历方法对此聚合对象进行内部元素的遍历。例如现实场景有一学校,局原创 2020-11-04 10:01:18 · 353 阅读 · 0 评论 -
行为型设计模式(三) 之 任务审批和权限的体现可使用责任链模式
1 定义责任链模式(Chain of Responsibility Pattern)又叫职责链模式或者职责连锁模式,属于行为型设计模式,它主要是为请求者进行发送请求动作时创建一个接收的对象链,而链上每一个接收者都包含着下一个接收者的引用,如果当前接收者不能处理指定的请求,便将该请求传递给下一个接收者,依此类推直到有一个接收者能为其处理为止,而请求者也并不知道发起的请求会在链上哪个接收者最终处理。例如现实场景,我们工作中需要请假,假如请假天数是3天内是部门经理审批;如果5天内是先部门经理审批,接着是总监审原创 2020-11-04 09:59:02 · 593 阅读 · 0 评论 -
行为型设计模式(二) 之 复杂条件封装来描述工作流变化常用状态模式
1 定义状态模式(State Pattern)属于行为型设计模式,它主要是为了解决在当一个对象状态决定该对象的行为且该状态的条件表达式过于复杂时,把状态的判断逻辑进行单独封装为不同的状态,正如工作流中通过每个节点的状态来决定跳转下一个节点的流程。例如现实场景,我们工作中需要请假,在OA系统上走流程,假如请假天数是3天内是部门经理审批,然后是行政登记;如果5天内是先部门经理审批,接着是总监审批,最后是行政登记;如果10天内最终还要老板审批,最后行政登记,这里根据请假的天数决定了审批流程,其每个审批节点就是原创 2020-11-04 09:55:42 · 603 阅读 · 0 评论 -
行为型设计模式(一) 之 策略模式擅长算法的封装与切换
1 定义策略模式(Strategy Pattern)属于行为型设计模式,它主要对一系列可供选择的算法进行单独封装,不同的算法实现不同的过程,但最终完成着一样的结果。例如现实场景中,商场促销活动中有着多种方案,如:满300减30、满3件打7折等,这些方案都可认为是一种对商品收费的算法,最终的目的都是为了结账。我们消费者根据商品价格和数量可以自由选择哪一种的方式进行结账从而达到价格最大的优惠。2 实现策略模式一般包含了3个角色,分别是:上下文环境(Context):用来操作策略的上下文环境。例如原创 2020-11-04 09:52:21 · 309 阅读 · 0 评论 -
结构型设计模式(七) 之 多维度分离成接口的桥接模式
1 定义桥接模式(Bridge Pattern),又叫柄体(Handle and Body)模式或接口(Interface)模式,属于结构型设计模式之一。它主要用于当对象存在多个维度特征时将维度分离出来,让抽象部分和实现部分分离,使每个维度可以独立扩展。它是继承关系的一个替代方案,且在特定场景中比使用继承生成子类更具有灵活性和可扩展性。例如现实场景中,我们要去吃一碗面,菜单上标着有牛肉面、鸡肉面,然后可以根据自己喜爱搭配辅食有香肠和鸡蛋。想象一下,如果使用继承来实现的话,会存在4种继承于面条的具体口味的原创 2020-08-27 09:59:20 · 633 阅读 · 0 评论 -
结构型设计模式(六) 之 一致对待树结构的组合模式
1 定义组合模式(Composite Pattern),又叫部分整体模式,属于结构型设计模式之一。它主要用于将一组相似的对象作为一个单一对象来看待,再依据树形结构来组合对象,用来表示部分以及整体层次,使得调用者可以使用一致的方法操作单个对象或组合对象。例如现实场景中,一个公司里面包含了人事部、技术部、业务部和分公司等,而分公司里的组织结构也同样具有人事部、技术部、业务部等部门。总公司部门和分公司部门都可以理解为属于公司统一管理,是公司的部门或叫旗下部门,这其实就是整体与部分可以被一致对待的表现。2原创 2020-08-27 09:56:36 · 447 阅读 · 0 评论 -
结构型设计模式(五) 之 享元模式是池技术的表现
1 定义享元模式(Flyweight Pattern)属于结构型设计模式之一,它主要是使用共享对象有效地避免了创建过多的性质相近的对象,从而降低内存的占用,提高程序的性能。它也是池技术的重要实现方式,正如常量池、数据库连接池、缓冲池等都是享元模式的应用。享元模式一般结合工厂模式一起使用,在获取对象时会尝试使用共享的已存在的同类对象,如果未能匹配到对象才再去创建新对象。这些对象分为两个部分:内部状态和 外部状态:内部状态,是对象内部可共享的信息,它并不会因外部环境改变而发生改变。外部状态,是对象外原创 2020-08-27 09:52:08 · 520 阅读 · 0 评论 -
结构型设计模式(四) 之 API的封装请用外观模式
1 定义外观模式(Facade Pattern)又叫门面模式,属于结构型设计模式之一。它主要用于当存在多个复杂的子系统需要调用时,通过引用一个外观角色来进行组合性封装来简化对外调用的入口,降低子系统与调用者的耦合度和降低调用者使用成本,一般常用于对SDK或者API的封装。例如实现场景中,我们使用一些电脑优化工具软件进行优化时,软件一般提供了:垃圾清理、病毒查杀、注册表清理、大文件查找等功能,而一般也会直接提供了一个充当外观角色的一键优化入口,当我们触发一键优化时,工具便会自动帮我们执行内部相应的子功能进原创 2020-08-27 09:49:51 · 679 阅读 · 0 评论 -
结构型设计模式(三) 之 代理模式就是桥梁连接调用
1 定义代理模式(Proxy Pattern)又名委托模式,属于结构型设计模式之一,它主要用于对现有一个对象提供一个代理对象,并由代理对象控制原现有对象的访问或访问前后增加相应逻辑。比如某些情况下,一个对象不适合直接引用另一个对象,而可以通过在引用和被引用之间加入一个代理对象明来作为一个桥梁连接调用。例如现实场景中,某品牌官方厂家可以卖商品,而它拥有着一些专卖店,我们想买它的商品时一般不会直接跑到厂家那里买,而是通过它的专卖店去买,而且说不定专卖店还常有优惠活动,这里的专卖店就是起到一个代理的作用,其实原创 2020-08-27 09:47:53 · 193 阅读 · 0 评论 -
结构型设计模式(二) 之 装饰者模式可给对象一层层加工
1 定义装饰者模式(Decorator Pattern)又叫包装模式属于结构型设计模式之一,它主要用于动态地给一个对象增加一些额外扩展的功能,它是继承关系的一个替代方案,且在特定场景中比使用继承生成子类更具有灵活性和可扩展性。例如现实场景中,我们要去点一碗牛肉面,通过加不同的配料如鸡蛋、香肠、酸菜、香葱、香菜等最终一碗普通面条通过根据你的口味不同的搭配后变成一碗你喜欢的面条。想象一下,鸡蛋+酸菜是一种搭配方式,鸡蛋+酸菜+香葱又是一种新的搭配方式,虽然最终成品离不开是一碗面条,但总不能每一种搭配都要创建原创 2020-08-27 09:43:49 · 358 阅读 · 0 评论 -
结构型设计模式(一) 之 适配器模式使接口兼容更好
1 定义适配器模式(Adapter Pattern)属于结构型设计模式之一,它主要用于处理不兼容的两个接口的协同工作,使一个接口转换成期望的另一个接口。例如现实场景中,手机充电器便是一个适配器,它将220V的电压转换成我们手机需要的5V电压、又例如读卡器也是一个适配器,它将SD卡转换成电脑的USB插口。在代码使用上,适配器模式其实就是增加一个适配器的类作为中间类将不兼容的接口转变成调用者需要的接口。2 实现适配器模式一般包含3个角色,分别是:被适配者(Adaptee),就是原有已存在的需要适原创 2020-08-27 09:40:58 · 725 阅读 · 1 评论 -
创建型设计模式(五) 之 原型模式就是克隆对象
1 定义原型模式(Prototype Pattern)属于创建型设计模式之一,它主要用于当直接创建对象的代价较大时对已有对象进行克隆从而节约性能成本。例如一个对象需要高代价的IO或访问数据库之后才能被创建出来,像这情况类初始化需要消化非常多的资源,那么我们一般可以将已经创建出来的对象作为原型进行缓存,在下一次再需要同样对象时对其进行克隆,克隆过程中原类的构造方法不会被执行。原型模式很少单独出现,一般是跟工厂模式进行配合,先将原型对象进行初始化缓存,然后通过工厂提供给调用者。2 实现我们沿用工厂模原创 2020-06-19 16:41:42 · 340 阅读 · 0 评论 -
创建型设计模式(四) 之 建造者模式专治多参的复杂对象的创建
1 定义建造者模式(Builder Pattern)属于创建型设计模式。又有人称为创建者模式、生成器模式、构造器模式等,它主要用于复杂对象的创建。那什么是复杂对象呢?其实简单地说就是类中构造方法有多个重载的版本和最终构造方法参数特别多的类的对象或者构造方法少但是属性特别多的类的对象。因为这种类需要外部传入相当多的参数来决定类的最终表现,所以它是复杂的。使用者在创建对象时需要决定使用哪个构造方法,然而里面的参数相当多还得搞清楚这些参数的含义,或者构造方法简单但需要多行代码来设置相当多的属性才能完成最终想要原创 2020-06-19 16:36:38 · 1186 阅读 · 0 评论 -
创建型设计模式(二、三) 之 工厂方法和抽象工厂模式的演变和适用场景
1定义工厂模式(Factory Pattern)属于创建型设计模式。如其名它提供了一种像实际场景中像加工厂的形式来进行创建类对象,其过程不会对客户端暴露创建逻辑,并且是通过使用共同的接口来返回新创建的对象。一般工厂模式双可分为简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)和 抽象工厂模式(Abstract Factory),其中严格来讲简单工厂不算是一个标准的的设计模式,但是工厂方法和抽象工厂都是通过简单工厂演变而来。2 简单工厂模式在介绍简单工厂模式原创 2020-06-19 16:31:31 · 605 阅读 · 0 评论 -
创建型设计模式(一) 之 正确使用单例模式使对象长存
1定义单例模式(Singleton Pattern)属于创建型设计模式之一,它应该算上是我们日常开发里最常用到的设计模式之一。其使用上就是让在当前进程下指定的类只被初始化一次,并且一般会一直保存于内存中,保证了全局对象的唯一性。比如线程池、缓存、日志等等都常常被设计成单例模式来使用。1.1 那单例和静态类的区别常有人拿单例和静态类作比较和混淆他们的使用场景,因为它们都是用于全局的访问。其实它们的区分还是很简单的:静态类:不具备面向对象的特性,不支持延时加载,一般用于工具类,静态的绑定是在编译原创 2020-06-19 16:21:34 · 2531 阅读 · 0 评论
分享