设计模式
文章平均质量分 82
设计模式
低吟不作语
这是最坏的时代,也是最好的时代
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
软件设计模式学习(二十七)访问者模式
访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素具有不同的类型,且不同的访问者可以对其进行不同的访问操作模式动机对于系统中某些对象,它们存储在同一个集合中,且具有不同的类型。对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式有所不同。在 Java 等面向对象语言中都提供了大量用于存储多个元素的集合对象,集合中存储的对象有时候是同一类型,有时候不是同一类型,或许它们只是具有共同的父类。假如我们要针对一个包含不同类型元..原创 2020-06-18 15:38:36 · 518 阅读 · 0 评论 -
软件设计模式学习(二十六)模板方法模式
模板方法是结构最简单的行为型设计模式,在抽象类中定义了一个称为模板方法的方法,在这个方法中定义其他基本方法的执行步骤,而基本方法的实现可以放在抽象类,也可以放在其子类模式动机现实生活中很多事情的完成过程都包含几个基本步骤,例如请客吃饭,无论吃什么,一般都包含点单、吃东西、买单几个步骤,到底吃什么则具体情况具体分析,在实际环境中由用户动态决定。既然这几个步骤的次序是固定的,于是我们创建一个新的方法叫“请客”,在其中调用了点单、吃东西和买单,同时指定它们的执行次序,我们称这个“请客”为模板方法,“..原创 2020-06-17 15:13:54 · 336 阅读 · 0 评论 -
软件设计模式学习(二十五)策略模式
策略模式用于算法的自由切换和扩展,实现了算法定义和算法分离的使用模式动机要完成一项任务,可以有多种不同的方式,例如人们外出旅游时可以选择多种不同的出行方式,如自行车、坐汽车、坐高铁或乘飞机等,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该任务。在实际的软件开发中,一项功能也有很多算法可以实现,如果我们直接把多种算法集中在一个类,或者说使用条件判断语句来进行选择,无疑会增加代码复杂性,不利于维护。为了解决这些问题,可以定义一些独立的类来封装不同的算法,每一类封装一..原创 2020-06-12 09:01:35 · 507 阅读 · 0 评论 -
软件设计模式学习(二十四)状态模式
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题模式动机很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态。一个对象可以拥有多个状态,这些状态可以相互转换,当对象状态不同时,其行为也有所差异。假设一个人就是对象,人根据心情不同会有很多状态,比如开心和伤心,这两种状态可以相互转换。开心的人可能会突然接到女朋友的分手电话,然后哭得稀里哗啦(醒醒!你哪来的女朋友?),过了一段时间后,又可能因为中了一百万彩票而欢呼雀跃。而且不同状态下人的行为也不同,有些人..原创 2020-06-06 10:38:23 · 729 阅读 · 1 评论 -
软件设计模式学习(二十三)观察者模式
观察者模式是一种经常使用的设计模式,在软件系统中对象并不是孤立存在的,一个对象行为的改变可能会导致其他与之存在依赖关系的对象行为发生改变,观察者模式用于描述对象之间的依赖关系。模式动机很多情况下,对象不是孤立存在的,想象这么一个场景:你和女朋友去旅行,晚上回到宾馆,女朋友穿着厚厚的大衣,从外表看上去就是个臃肿的包子。你没有反应,等到女朋友洗完澡裹着浴巾出来以后,你立马眼睛都瞪直了,活脱脱一个大色狼(不…不要盯着人家看了啦)从例子中,我们不难分离出两类角色,一类为观察者,如色眯眯的你,另一类就是..原创 2020-06-01 17:10:23 · 1880 阅读 · 1 评论 -
软件设计模式学习(二十二)备忘录模式
备忘录模式提供了一种对象状态的撤销实现机制,当系统中某一对象需要恢复到某一历史状态时可以使用备忘录模式来进行设计模式动机人人都有后悔的时候,在软件使用过程中难免会出现一些误操作,如不小心删除了某些文字或图片,数据填入错误等,对于这些误操作,需要提供一种后悔药机制,让系统可以回到误操作前的状态,这就是备忘录模式的模式动机模式定义在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。备忘录模式是一种对象行为型模式,其别名为 Toke..原创 2020-05-28 11:44:33 · 628 阅读 · 0 评论 -
软件设计模式学习(二十一)中介者模式
对于那些存在对象之间复杂交互关系的系统,中介者模式提供了一种简化复杂交互的解决方案,即通过引入一个中介者,将原本对象之间的两两交互转化为每个对象与中介者之间的交互模式动机以微信聊天为例,可以用户与用户直接聊天,也可以通过微信群聊天。前者的话,用户要和别的用户加为好友,即用户和用户之间存在多对多关系,一个用户如果要将相同的信息发送给所有其他用户,必须一个一个发送。而如果使用群聊天,一个用户可以向多个用户发送相同信息而无须一一进行发送,只需将信息发送到群中即可,群的作用就是将发送者所发送的信息转发给..原创 2020-05-27 12:54:06 · 827 阅读 · 0 评论 -
软件设计模式学习(二十)迭代器模式
迭代器模式是一种使用频率非常高的设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,聚合对象只负责存储数据,而遍历数据由迭代器来完成。模式动机一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。此外,针对不同的需要,可能还要以不同方式遍历整个聚合对象,但是我们不希在聚合对象的抽象层接口中充斥着各种不同遍历的操作。怎样遍历一个聚合对象,又不需要了解聚..原创 2020-05-25 16:00:21 · 901 阅读 · 0 评论 -
软件设计模式学习(十九)解释器模式
解释器是一种不常使用的设计模式,它用于描述如何构成一个简单的语言解释器,主要应用于使用面向对象语言开发的编译器和解释器设计。当我们需要开发一个新的语言时,可以考虑使用解释器模式模式动机如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子。再构建一个解释器,解释器通过解释这些句子来解决对应的问题。举个例子,我们希望系统提供一个功能来支持一种新的加减法表达式语言,当输入表达式为 “1 + 2 + 3 - 4 + 1” 时,输出计算结果为 3。为了实现上述..原创 2020-05-23 20:34:32 · 892 阅读 · 0 评论 -
软件设计模式学习(十八)命令模式
命令模式将请求发送者与请求接收者解耦,在发送者与接收者之间引入命令对象,将发送者的请求封装在命令对象中,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性,用户可以根据需要为请求发送者增加新的命令对象而无须修改原有系统模式动机举个现实生活中的例子,开关是请求的发送者,电灯是请求的接收者,它们之间不存在直接的耦合关系,而是通过电线连接到一起,开关不需要知道如何将开灯或关灯请求传输给电灯,而是通过电线来完成这项功能。此时可以理解为电线充当封装请求的命令对象,开关如果开则电线通电,并调..原创 2020-05-18 17:14:40 · 1926 阅读 · 0 评论 -
软件设计模式学习(十七)职责链模式
系统中如果存在多个对象可以处理一个同一请求,可以通过职责链模式将这些处理请求的对象连成一条链,让请求沿着该链进行传递。如果链上的对象可以处理该请求则进行处理,否则将请求转发给下家处理模式动机很多情况下,可以处理某个请求的对象不止一个,如大学里的奖学金审批,学生先向辅导员提交审批表,辅导员签字审批后再交给系主任签字审批,接着是院长审批,最后可能是校长审批,在这个过程中,奖学金申请表可以看作一个请求对象,不同级别审批者都可以处理该请求,除了辅导员之外,学生不需一一和其他审批者交互,只需等待结果即可。..原创 2020-05-16 17:21:44 · 457 阅读 · 0 评论 -
软件设计模式学习(十六)代理模式
当直接访问某些对象存在问题时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。模式动机某些情况下,一个客户不想或不能直接引用一个对象,此时可以通过一个称之为代理的第三者实现间接引用。代理对象在客户端和目标对象之间起到中介作用,并且可以通过代理对象去掉客户不能看到的内容和添加客户需要的额外服务。模式定义给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做 Proxy 或 Surrogate,它是一种对象结构模式..原创 2020-05-14 22:40:03 · 621 阅读 · 0 评论 -
软件设计模式学习(十五)享元模式
享元模式当系统中存在大量相同或相似的对象时,享元模式是一种较好的解决方案,它通过共享技术实现相同或相似的细粒度对象的复用,从而节约内存空间。享元模式提供了一个享元池用于存储已经创建好的享元对象,并通过享元工厂类将享元对象提供给客户端使用。模式动机使用面向对象技术开发时,很多情况下需要在系统中增加类和对象的个数,并且这些对象有些是相同或相似的。当对象太多时,将导致运行代价过高,性能下降等问题。为了避免系统中出现大量相同或相似的对象,享元模式通过共享技术实现相同或相似对象的重用,相同的对象都指向一.原创 2020-05-09 17:57:30 · 704 阅读 · 0 评论 -
软件设计模式学习(十四)外观模式
外观模式是一种使用频率非常高,但理解较为简单的设计模式,通过引入一个外观角色来简化客户端与子系统之间的操作,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。模式动机在大多数情况下,一个网站都会提供一个网站首页。网站首页一般作为整个网站的入口,提供了通往各个子栏目的超链接,用户通过该首页即可进入子栏目获取所需信息。对于用户而言只需记住网站首页网站...原创 2020-05-02 15:25:21 · 984 阅读 · 0 评论 -
软件设计模式学习(十三)装饰模式
装饰者模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态增加职责,使对象之间的关联关系取代类之间的继承关系。模式动机装饰者可以在不改变一个对象本身的基础上给对象增加额外的新行为,如一张照片,可以不改变照片本身,给她增加一个相框,使得它具有防潮功能,而且用户可以根据需要增加不同类型的相框。在软件开发中,类似给照片增加相框的情况随处可见,如给一个图形界面构件增加边框、滚动...原创 2020-05-01 13:42:23 · 1101 阅读 · 0 评论 -
软件设计模式学习(十二)组合模式
组合模式组合模式关注那些存在于叶子构件和容器构件的结构以及它们的组织形式,叶子构件中不能包含成员对象,容器构件中可以包含成员对象,这些成员对象可能是叶子构件对象,也可能是容器构件对象。这些对象可以构成一个树形结构,组合模式是用面向对象的方法处理树形结构。模式动机在Windows操作系统的文件目录结构包含文件和文件夹两类对象,其中在文件夹可以包含子文件夹,也可以包含文件。文件夹是容器类,...原创 2020-03-16 14:41:15 · 1006 阅读 · 0 评论 -
软件设计模式学习(十一)桥接模式
桥接模式桥接模式用一种很巧妙的方式处理继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。模式动机设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要四个形状类,如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有两种设计方案:第一种是为每一个行政都提供一套各种颜色的...原创 2020-03-13 17:57:12 · 762 阅读 · 0 评论 -
软件设计模式学习(十)适配器模式
适配器模式适配器模式是一种使用频率非常高的结构型设计模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容二不能一起工作的两个类协同工作。模式动机我国的生活用电电压是220V,而笔记本电脑、手机等电子设备的电压都没有这么高。这时候就需要电源适配器,使得生活用电和笔记本电脑可以兼容。软件开发中采用类似电源适配器的设计和编码技巧被称为适配器模式。有时,现有类所提...原创 2020-03-12 14:19:10 · 660 阅读 · 0 评论 -
软件设计模式学习(九)单例模式
单例模式通过单例模式可以保证系统中一个类只有一个实例而且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决办法。模式动机与定义对系统中某些类来说,只有一个实例很重要,例如,一个系统只能有一个窗口管理器或文件系统。因此确保系统中某个对象的唯一性即一个类只能有一个实例很重要。单例模式确保某一个类只有一个实例,而且自...原创 2020-03-11 00:54:24 · 919 阅读 · 0 评论 -
软件设计模式学习(八)原型模式
原型模式在软件系统中,有时候需要多次创建某一类型对象,为了简化创建过程,可以只创建一个对象,然后再通过克隆的方法复制出多个相同的对象,这就是原型模式的设计思想。模式定义原型模式是一种对象创建模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。模式结构Prototype(抽象原型类)抽象原型类是定义具有克隆自己方法的接口,是所有具体原型类的公共父类,可以是...原创 2020-03-09 22:26:56 · 711 阅读 · 0 评论 -
软件设计模式学习(七)建造者模式
建造者模式建造者模式是最复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配部分,只需知道建造者的类型即可。模式动机建造者模式用于创建一个包含对个组成部分的复杂对象,可以返回一个完整的产品对象给用户。用户无须知道创建过程和内部细节,只需直接使用创建好的完整对象即可。比如汽车拥有车轮、方向盘、发送机等各种部件,用户几乎不会单独...原创 2020-03-08 19:53:45 · 513 阅读 · 0 评论 -
软件设计模式学习(六)抽象工厂模式
抽象工厂模式抽象工厂模式是常见的建造型设计模式之一,比工厂方法模式抽象程度更高。工厂方法模式中具体工厂只生产一种具体产品,但在抽象工厂模式中,具体工厂可以生产相关的一组具体产品,这样一组产品称为产品族,产品族中的每一个产品分属于某一产品继承等级结构。模式动机有时候我们需要一个工厂提供多个产品对象,而不是单一一个产品对象,如一个电器设备工厂,它可以生产电视机、电冰箱、空调等设备,而不只是...原创 2020-03-07 21:14:52 · 770 阅读 · 0 评论 -
软件设计模式学习(五)工厂方法模式
工厂方法模式工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时弥补了简单工厂的缺陷,更好地符合开闭原则的要求,增加新的具体产品对象不需要对已有系统作任何修改。模式定义工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,属于类创建模式。在工厂模式中,工厂父类负责定义产品对象的公共接口,而子工厂模式负责生成具体的产品对象,这样做的目的是将产品类实例化操作延迟到工...原创 2020-03-06 21:48:40 · 937 阅读 · 0 评论 -
软件设计模式学习(四)简单工厂模式
简单工厂模式简单工厂模式是最简单的设计模式之一,虽然不属于二十三种设计模式,但应用也较为频繁。学习它也是学习其他创建型模式的基础模式定义在实际软件开发中,有时需创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。习惯上将获得其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法获得对象,该方法也称...原创 2020-03-05 22:04:51 · 639 阅读 · 0 评论 -
软件设计模式学习(三)软件模式概述
软件模式概述设计模式已广泛应用于面向对象系统设计和开发,成为面向对象技术的一个重要组成部分。当人们在特定环境下遇到特定类型的问题时,可以采用他人已使用过的一些已经成功的解决方案,既降低了分析、设计和实现的难度,也使得系统具有更好的可重用性和灵活性软件模式设计模式起源于建筑领域,模式描述了解决问题的核心方法,通过这种方式,我们可以无数次地重用那些已有的解决方案,无须重复相同的工作。模...原创 2020-03-05 14:54:54 · 877 阅读 · 0 评论 -
软件设计模式学习(二)面向对象设计原则
面向对象设计原则面向对象设计原则是学习设计模式的基础,每一种设计模式都符合某一种或多种面向对象设计原则。在软件开发中使用这些原则可以提高软件的可维护性和可复用性,让我们可以设计出更加灵活也更容易扩展的软件设计,实现可维护性复用的目标。单一职责原则定义一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。分析一个类承担的职责越多,被复用的可能性越小,并且相当于将这些...原创 2020-03-04 16:13:46 · 482 阅读 · 0 评论 -
软件设计模式学习(一)统一建模语言 UML
UML简介统一建模语言(UML)是一种可视化的标准建模语言,通过UML可以构造软件系统的蓝图。在设计模式中,使用UML来分析和设计每一个模式的结构,描述每一个模式实例,帮助我们深入理解设计模式。比如要盖一栋房子,需要先设计图纸,设计图纸就是一种设计语言,也就是模型语言。在一个现代化工程中,人们要沟通和协作,就必须使用标准的工业化设计语言,通过建模进行描述,把所要设计的结构和系统的行为联系起来,...原创 2020-03-03 19:08:45 · 849 阅读 · 0 评论
分享