Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Design Patterns 设计模式汇总 #220

Open
bingoohuang opened this issue May 20, 2022 · 16 comments
Open

Design Patterns 设计模式汇总 #220

bingoohuang opened this issue May 20, 2022 · 16 comments
Labels

Comments

@bingoohuang
Copy link
Owner

bingoohuang commented May 20, 2022

23 种 GoF 设计模式

这个网站讲解各种设计模式的含义和用法,有英文版和中文版,每一种设计模式都配上了插图讲解。

image

image

image

@bingoohuang
Copy link
Owner Author

image

source

@bingoohuang
Copy link
Owner Author

创建型模式:筹工建单元,筹(抽象工厂)工(工厂方法)建(建造者)单(单例)元(原型)
结构性模式:相门桥租装饰带,相(享元)门(门面)桥(桥接)租(组合)装(装饰器)饰(适配器)带(代理)

@bingoohuang
Copy link
Owner Author

2009 年系统架构师考试科目一:综合知识

  1. 某软件公司欲开发一个 Windows 平台上的公告板系统。在明确用户需求后,该公司的 架构师决定采用 Command 模式实现该系统的界面显示部分,并设计 UML 类图如下 图所示。图中与 Command 模式中的“Invoker”角色相对应的类是( ) ,与“ConcreteCommand”角色相对应的类是() 。

image

A.Command B.MenuItem C.Open D.ButktinBoardScreen
A.Command B.MenuItem C.Open D.BulktinBoardScreen

【解析】
Command(命令)模式是设计模式中行为模式的一种,它将“请求”封装成对象,以便使
用不同的请求、队列或者日志来参数化其他对象。Command 模式也支持可撤销的操作。
Command 模式的类图如下所示。

image

对于题目所给出的图,与“Invoker”角色相对应的类是 MenuItem,与“Concrete Command”
角色相对应的类是 Open。

  1. 某软件公司基于面向对象技术开发了一套图形界面显示构件库 VisualComponent。在使
    用该库构建某图形界面时,用户要求为界面定制一些特效显示效果,如带滚动条、能够
    显示艺术字体的透明窗体等。针对这种需求,公司采用( ) 最为灵活。

A.桥接模式
B.命令模式
C.组合模式
D.装饰模式

【解析】
根据题干描述,可以看出其基础是一个图形界面,并要求为图形界面提供一些定制的特
效,例如带滚动条的图形界面,能够显示艺术字体且透明的图形界面等。这要求能够动态地
对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。对照选项中的 4 种设计
模式,装饰模式最符合这一要求。

  1. 某软件公司承接了为某工作流语言开发解释器的工作。该工作流语言由多种活动节点构
    成,具有类 XML 的语法结构。用户要求解释器工作时,对每个活动节点进行一系列
    的处理,包括执行活动、日志记录、调用外部应用程序等,并且要求处理过程具有可扩
    展能力。针对这种需求,公司采用( ) 最为恰当。

A.适配器模式
B.迭代器模式
C.访问者模式
D.观察者模式

【解析】
根据题干描述,可以看出本题的核心在于对某个具有固定结构的活动节点需要多种处理
能力,且处理能力可扩展,也就是说要求在不改变原来类结构(活动节点)的基础上增加新
功能。对照 4 个选项,发现访问者模式最符合要求。

@bingoohuang
Copy link
Owner Author

2010 年系统架构师考试科目一:综合知识

  1. 某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文中输 入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转 发给其他查询环境。基于上述需求,采用( )最为合适。

A.责任链模式 B.桥接模式 C.装饰模式 D.适配器模式

【解析】
本题主要考查设计模式的理解与应用。根据题干描述,在线文档系统需要根据用户的查
询需求逐步将查询请求依次传递,对比 4 个候选项,其中在责任链模式里,很多对象由每一 个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对 象决定处理此请求。因此责任链模式是能够满足该要求的最好模式。

  1. 某公司欲开发一套窗体图形界面类库。该类库需要包含若干预定义的窗格(Pane)对象, 例如 TextPane、ListPane 等,窗格之间不允许直接引用。基于该类库的应用由一个包 含一组窗格的窗口组成,并需要协调窗格之间的行为。基于该类库,在不引用窗格的前 提下实现窗格之间的协作,应用开发者应采用( )最为合适。

A.备忘录模式 B.中介者模式 C.访问者模式 D.迭代器模式

【解析】
本题主要考查设计模式的理解与应用。根据题干描述,应用系统需要使用某公司开发的 类库,该应用系统是一组窗格组成,应用需要协调窗格之间的行为,并且不能引用窗格自身, 在这种要求下,对比 4 个候选项,其中中介者模式用一个中介对象封装一系列的对象交互。 中介者使用各对象不需要显式的相互调用,从而使其耦合松散。可以看出该模式最符合需求。

  1. 某公司开发一个文档编辑器,该编辑器允许在文档中直接嵌入图形对象,但开销很大。 用户在系统设计之初提出编辑器在打开文档时必须十分迅速,可以暂时不显示当前页面 以外的图形。针对这种需求,公司可以采用( )避免同时创建这些图形对象。

A.代理模式 B.外观模式 C.桥接模式 D.组合模式

【解析】
本题主要考查设计模式的理解与应用。根据题干描述,该编辑器需要在文档中嵌入显示 开销很大的图形对象,为了能够提高系统效率,需要避免同时创建这些图像。这对这些要求, 对比候选项,可以发现代理模式可以解决直接访问对象时带来的问题,例如:要访问的对象 在远程的机器上;对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问 等。因此代理模式是最为合适的设计模式。

@bingoohuang
Copy link
Owner Author

2011 年系统架构师考试科目一:综合知识

  1. 某公司欲开发一门户网站,将公司的各个分公司及办事处信息进行整合。现决定采用 composite 设计模式来实现公司的组织结构关系,并设计了如图所示的 UML 类图。图 中与 Composite 模式中的“Component”角色相对应的类是( 1 ),与“Composite”角色 相对应的类是( 2 )。

image

(1) A.Company
B.Finance Department
C.HRDepartment
D.ConcreteCompany
(2) A.Company
B.Finance Department
C.HRDepartment
D.ConcreteCompany

【解析】
本题考查组合模式相关的知识。下图为组合模式的 UML 图例。与题目给出的图例进行
匹配可得出答案

image

【答案】A、D。

  1. 某软件公司正在设计一个通用的嵌入式数据处理平台,需要支持各种数据处理芯片之间
    的数据传递与交换。该平台的核心功能之一要求能够屏蔽芯片之间的数据交互,使其耦
    合松散,并且可以独立改变芯片之间的交互过程。针对上述需求,采用( )最为合适。

A.抽象工厂模式
B.策略模式
C.中介者模式
D.状态模式

【解析】
本题主要考查对设计模式的理解和掌握。根据题干描述,该系统需要能够支持不同芯片
之间的数据交互,并能够独立改变芯片之间的数据交互过程。这种情况下,可以引入一个中
介层,通过中介层屏蔽不同芯片之间的两两交互。根据上述分析,选项中列举的设计模式中,
中介者模式最符合要求。

  1. 某软件公司正在设计一个图像处理软件,该软件需要支持用户在图像处理过程中的撤销
    和重做等动作,为了实现该功能,采用( )最为合适。

A.单例模式
B.命令模式
C.访问者模式
D.适配器模式

【解析】
根据题干描述,系统需要支持用户在图像处理过程中的撤销和重做的动作,因此可以将
用户动作封装成对象,通过对象之间的传递和转换实现撤销和重做等动作。根据上述分析,
选项中列举的设计模式中,命令模式最符合要求。

  1. 某互联网公司正在设计一套网络聊天系统,为了限制用户在使用该系统时发表不恰当言
    论,需要对聊天内容进行特定敏感词的过滤。针对上述功能需求,采用______能够灵活
    配置敏感词的过滤过程。

A.责任链模式
B.工厂模式
C.组合模式
D.装饰模式

【解析】
本题考查常见设计模式的特点。
Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而
无需指定它们具体的类。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机
会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理
它。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单
个对象和复合对象的使用具有一致性。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类
方式更为灵活。
依据题意,需要限制用户在使用聊天系统时发表不恰当言论,需要对聊天内容进行特定
敏感词的过滤,最为关键的一点是需要灵活配置过滤关键字。如果本系统采用责任链模式,
即可达到这一点。

@bingoohuang
Copy link
Owner Author

2012 年系统架构师考试科目一:综合知识

  1. 某软件公司欲设计一款图像处理软件,帮助用户对拍摄的照片进行后期处理。在软件需求分析阶段,公司的系统分析师识别出了如下 3 个关键需求。
    图像处理软件需要记录用户在处理照片时所有动作,并能够支持用户动作的撤销与重做 等行为。
    图像处理软件需要根据当前正在处理的照片的不同特征选择合适的处理操作,处理操作 与照片特征之间具有较为复杂的逻辑关系。
    图像处理软件需要封装各种图像处理算法,用户能够根据需要灵活选择合适的处理算 法:软件还要支持高级用户根据一定的规则添加自定义处理算法。
    在系统设计阶段,公司的架构师决定采用设计模式满足上述关键需求中对系统灵活性与 扩展性的要求。
    具体来说,为了支持灵活的撤销与重做等行为,采用( )最为合适;
    为了封 装图像操作与照片特征之间的复杂逻辑关系,采用( )最为合适;
    为了实现图像处理算法的 灵活选择与替换,采用( )最为合适。

A.工厂模式 B.责任链模式 C.中介者模式 D.命令模式
A.状态模式 B.适配器模式 C.组合模式 D.单例模式
A.模板方法模式 B.访问者模式 C.策略模式 D.观察者模式

【解析】

本题主要考查设计模式知识。题干描述了某软件公司一款图像处理软件的需求分析与设 计过程,并明确指出采用设计模式实现关键需求对系统灵活性与扩展性的要求。
针对需求 1,为了支持灵活的撤销与重做等行为,采用命令模式最为合适,因为命令模 式可以将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,还可以对 请求排队,或记录请求日志,以及支持可撤消的操作。
针对需求 2,为了封装图像操作与照片特征之间的复杂逻辑关系,采用状态模式最为合 适,因为状态模式将每一个条件分支放入一个独立的类中,这样就可以根据对象自身的情况 将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化;
针对需求 3,为了实现图像处理算法的灵活选择与替换,采用策略模式最为合适,因为 策略模式定义一系列的算法,把它们封装起来, 并且使它们可相互替换,使得算法可独立 于使用它的客户而变化。
【答案】D、A、C。

  1. 若系统中的某子模块需要为其他模块提供访问不同数据库系统的功能,这些数据库系统 提供的访问接口有一定的差异,但访问过程却都是相同的,例如,先连接数据库,再打 开数据库,最后对数据进行查询。针对上述需求,可以采用( )设计模式抽象出相同的 数据库访问过程,该设计模式( )。
    (1)A.外观 B.装饰 C.桥接 D.享元
    (2)A.可以动态、透明地给单个对象添加职责
    B.为子系统定义了一个高层接口,这个接口使得这一子系统更加容易使用
    C.通过运用共享技术,有效支持大量细粒度的对象
    D.将抽象部分与它的实现部分分离,使它们都可以独立地变化

【解析】
外观(façade)模式是对象的结构模式,要求外部与一个子系统的通信必须通过一个统一 的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接 口,这个接口使得这一子系统更加容易使用。
【答案】A、B。
扩展:这个题本身出题有问题,这个场景最合适的,其实是模板方法,因为固定了流程 但没有固定里面的内容。但给出的选项中,没有这个选项,所以已然没有最合适的了。也就 这个原因才选到 A。其实如果说外观也算能行,用桥接也是可以的。把过程作为抽象,把里 面要处理的内容作为实现部分。

@bingoohuang
Copy link
Owner Author

2013 年系统架构师考试科目一:综合知识

  1. 某系统中的文本显示类( TextView )和图片显示类( PictureView )都继承了组件类 ( Component ),分别显示文本和图片内容,现需要构造带有滚动条或者带有黑色边框, 或者既有滚动条又有黑色边框的文本显示控件和图片显示控件,但希望最多只增加 3 个类。那么采用设计模式( )可实现该需求,其优点是( )。

(1)A.外观 B.单体 C.装饰 D.模板方法
(2)A.比静态继承具有更大的灵活性
B.提高已有功能的重复使用性 C.可以将接口与实现相分离 D.为复杂系统提供了简单接口

【解析】
装饰模式:动态地给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵 活的替代,比派生一个子类更加灵活。
在本题中,“现需要构造带有滚动条或者带有黑色边框,或者既有滚动条又有黑色边框 的文本显示控件和图片显示控件”,从此处可以看出需要能为构件灵活附加功能的机制,这 与装饰模式的情况是吻合的。这样做比静态继承具有更大的灵活性。

@bingoohuang
Copy link
Owner Author

bingoohuang commented Sep 3, 2022

2014 年系统架构师考试科目一:综合知识

  1. 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理 解。采用( )模式,用一个特定对象来封装一系列的对象交互,从而使各对象不需要显 式地相互引用,使其耦合松散,而且可以独立地改变它们之间的交互。

A.解释器(Interpreter) B.策略(Strategy) C.中介者(Mediator) D.迭代器(Iterator)

【解析】

解释器(interpreter)模式。解释器模式属于类的行为型模式,描述了如何为语言定义一个 文法,如何在该语言中表示一个句子,以及如何解释这些句子,这里的“语言”是使用规定 格式和语法的代码。解释器模式主要用在编译器中,在应用系统开发中很少用到。
策略(strategy)模式。策略模式是一种对象的行为型模式,定义一系列算法,并将每一个 算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,其目 的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类。
中介者(mediator)模式。中介者模式是一种对象的行为型模式,通过一个中介对象来封 装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且 可以独立地改变它们之间的交互。中介者对象的存在保证了对象结构上的稳定,也就是说, 系统的结构不会因为新对象的引入带来大量的修改工作。
迭代器(iterator)模式。迭代器模式是一种对象的行为型模式,提供了一种方法来访问聚 合对象,而不用暴露这个对象的内部表示。迭代器模式支持以不同的方式遍历一个聚合对象, 复杂的聚合可用多种方法来进行遍历;允许在同一个聚合上可以有多个遍历,每个迭代器保 持它自己的遍历状态,因此,可以同时进行多个遍历操作。
扩展:设计模式分类:创建型模式、结构型模式、行为型模式。

  1. 某广告公司的宣传产品有宣传册、文章、传单等多种形式,宣传产品的出版方式包括纸 质方式、CD、DVD、在线发布等。现要求为该广告公司设计一个管理这些宣传产品的 应用,采用( )设计模式较为合适,该模式()。
    (1)A.Decorator B.Adapter C.Bridge D.Facade
    (2)A.将一系列复杂的类包装成一个简单的封闭接口
    B.将抽象部分与它的实现部分分离,使它们都可以独立地变化 C.可在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责 D.将一个接口转换为客户希望的另一个接口

【解析】
本题考点是设计模式,不同的设计模式可以应用于不同的场景,在本题题干部分提到宣 传产品有多种表现形式,又有多种媒介,如果用一棵类树来表达,必然会带来“类爆炸”(题 目中增加一种媒介,代码实现中需要增加多个类)的问题,所以使用桥接模式是合适的。桥 接模式的最核心特点便是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

@bingoohuang
Copy link
Owner Author

bingoohuang commented Sep 3, 2022

2015 年系统架构师考试科目一:综合知识

  1. 某软件公司欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。在明确用
    户需求后,该公司的架构师决定采用 Bridge 模式实现该软件,并设计 UML 类图如下图
    所示。图中与 Bridge 模式中的“Abstraction”角色相对应的类是( ),与“Implementor”
    角色相对应的类是( )。

image

A.Shape B.Drawing C.Rectangle D.V2Drawing
A.Shape B.Drawing C.Rectangle D.V2Drawing

【解析】
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结
构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。桥接模式类似于多重
继承方案,但是多重继承方案往往违背了类的单一职责原则,其复用性比较差,桥接模式是
比多重继承方案更好的解决方法。
桥接模式的结构如下图所示,其中:

image

图中与 Bridge 模式中的“Abstraction”角色相对应的类是 Shape,与“Implementor”角
色相对应的类是 Drawing。 【答案】:A、B。

  1. 在面向对象设计的原则中、( )原则是指抽象不应该依赖予细节,细节应该依赖于抽象,即应针对接口编程,而不是针对实现编程。

A.开闭 B.里氏替换 C.最少知识 D.依赖倒置

【解析】
单一职责原则:设计目的单一的类。
开放-封闭原则:对扩展开放,对修改封闭。
李氏(Liskov)替换原则:子类可以替换父类。
依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程。
接口隔离原则:使用多个专门的接口比使用单一的总接口要好。
组合重用原则:要尽量使用组合,而不是继承关系达到重用目的。
迪米特(Demeter)原则(最少知识法则):一个对象应当对其他对象有尽可能少的了解。

@bingoohuang
Copy link
Owner Author

2016 年系统架构师考试科目一:综合知识

  1. 设计模式基于面向对象技术,是人们在长期的开发实践中良好经验的结晶,提供了一个 简单、统一的描述方法,使得人们可以复用这些软件设计办法、过程管理经验。按照设 计模式的目的进行划分,现有的设计模式可以分为创建型、( )和行为型三种类型。 其中( )属于创建型模式,( )属于行为型模式。( )模式可以将一个复杂的组件 分成功能性抽象和内部实现两个独立的但又相关的继承层次结构,从而可以实现接口与 实现分离。

A.合成型 B.组合型 C.结构型 D.聚合型
A.Adaptor B.Facade C.Command D.Singleton
A.Decorator B.Composite C.Memento D.Builder
A.Prototype B.Flyweight C.Adapter D.Bridge

设计模式包括:创建型、结构型、行为型三大类别。 Singleton 是单例模式,属于创建型设计模式。 Memento 是备忘录模式,属于行为型设计模式。 Bridge 是桥接模式,它的特点是实现接口与实现分离

@bingoohuang
Copy link
Owner Author

2017 年系统架构师考试科目一:综合知识

  1. 按照设计模式的目的进行划分,现有的设计模式可以分为三类。其中创建型模式通过采用抽象类所定义的接 口,封装了系统中对象如何创建、组合等信息,其代表有( )模式等;( )模式主要用于如何组合己有的类 和对象以获得更大的结构,其代表有 Adapter 模式等;( )模式主要用于对象之间的职责及其提供服务的分 配方式,其代表有( )模式等。
    A.Decorator B.Flyweight C.Command D.Singleton
    A.合成型 B.组合型 C.结构型 D.聚合型
    A.行为型 B.交互型 C.耦合性 D.关联型
    A.Prototype B.Facade C.Proxy D.Visitor

【解析】

设计模式包括:创建型、结构型、行为型三大类别。 Singleton 是单例模式,属于创建型设计模式。 Adapter 是适配器模式,属于结构型设计模式。
Visitor 是访问者模式,属于行为型设计模式。 【答案】D、C、A、B。

@bingoohuang
Copy link
Owner Author

2018 年系统架构师考试科目一:综合知识

  1. 设计模式描述了一个出现在特定设计语境中的设计再现问题,并为它的解决方案提供了 一个经过充分验证的通用方案,不同的设计模式关注解决不同的问题。例如,抽象工厂 模式提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类, 它是一种(54)模式;(55)模式将类的抽象部分和它的实现部分分离出来,使它们可 以独立变化,它属于(56)模式;(57)模式将一个请求封装为一个对象,从而可用不 同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。

(54)A. 组合型 B. 结构型 C. 行为型 D. 创建型
(55)A. Bridge B. Proxy C. Prototype D. Adapter
(56)A. 组合型 B. 结构型 C. 行为型 D. 创建型
(57) A. Command B. Facade C. Memento D. Visitor

【解析】

抽象工厂模式是一种类创建型模式。
桥接模式(Bridge)-将抽象部分与它的实现部分分离,使它们都可以独立地变化,它是一种 对象结构型模式。
命令(Command)模式将一个请求封装为一个对象,从而可用不同的请求对客户进行 参数化,将请求排队或记录请求日志,支持可撤销的操作。
答案 DABA。

@bingoohuang
Copy link
Owner Author

bingoohuang commented Sep 3, 2022

设计模式速记

速记关键词:动态生产对象
工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定需要实例化哪一个类。工厂方法使得子类实例化的过程推迟1.
速记关键词:生产成系列对象
抽象工厂模式(Abstract Factory):提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类2.
速记关键词:复杂对象构造
构建器模式(Builder):将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示3.
速记关键词:克隆对象
原型模式(Prototype):用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象4.
速记关键词:单实例
单例模式(Singleton):保证一个类只有一个实例,并提供一个访问它的全局访问点5.
速记关键词:转换接口
适配器模式(Adapter):将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同工作6.
速记关键词:***继承树拆分 ***
桥接模式(Bridge):将类的抽象部分和它的实现部分分离开来,使它们可以独立地变化7.
速记关键词:树形目录结构
组合模式(Composite):将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性8.
速记关键词:动态附加职责
装饰模式(Decorator):动态地给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活9.
速记关键词:对外统一接口
外观模式(Facade):定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用10.
速记关键词:汉字编码
享元模式(Flyweight):提供支持大量细粒度对象共享的有效方法11.
速记关键词:快捷方式
代理模式(Proxy)--结构型:为其他对象提供一种代理以控制这个对象的访问12.
速记关键词:传递职责
职责链模式(Chain of Responsibility):通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求13.
速记关键词:日志记录,可撤销
命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作14.
速记关键词:虚拟机的机制
解释器模式(Interpreter):给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子15.
速记关键词:数据集
迭代器模式(Iterator):提供一种方法来顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示16.
速记关键词:不直接引用
中介者模式(Mediator)--行为型:用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合,还可以独立地改变对 象间的交互17.
速记关键词:游戏存档
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态18.
速记关键词:联动
观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新19.
速记关键词:状态变成类
状态模式(State):允许一个对象在其内部状态改变时改变它的行为20.
速记关键词:多方案切换
策略模式(Strategy):定义一系列算法,把它们一个个封装起来,并且使它们之间可互相替换,从而让算法可以独立于使用它的用户而变化21.
速记关键词:框架、骨架
模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定 义算法的某些特定步骤22.
速记关键词:数据与操作分离
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作23.

@bingoohuang
Copy link
Owner Author

有一个编程原则叫做 DRY(Don't repeat yourself,不要重复自己),指的是尽量不要有重复的代码。

更好的名字应该是 SPOT(Single Point Of Truth,单点事实)。代码需要修改时,你只需要在一个地方修改,而不必改动多个地方。

https://news.ycombinator.com/item?id=32012566

@bingoohuang
Copy link
Owner Author

谈谈我工作中的 23 个设计模式

原文

从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。后面阅读设计模式后,为了加深理解,对相关图片进行了描绘和微调。
从技术的角度已经有很多好的总结,本文会换一种角度思考,既然设计模式研究的是类与类的关系,我们作为工作的个体,一些工作中的策略是不是也可以进行类比,可以更好地去思考这些模式?答案是肯定的。

抽象工厂(Abstract Factory):多套方案

抽象工厂模式是对创建不同的产品类型的抽象。对应到工作中,我们的确应该具备提供多套方案的能力,这也是我们常说的,要提供选择题。当你有这样的前瞻意识,一般也会被打上思考较多的标签,但是内在来说,的确想问题更加全面了。

image

生成器(Builder):善于分解

生成器模式是对一个个体的创建过程进行细分,拆解为不同的创建部分。这个对应到工作中,作为一些项目管理人员或者团队管理者,需要将一个大泥球一样的事务,合理分解,让大家各司其职,充分发挥才能。同样,我们对日常的工作内容,也可以按照结构去进行划分,从而更有调理。

image

工厂方法(Factory Method):抽象思考

工厂方法模式是说将提供某一产品的过程进行抽象,通过接口的模式去规范出来。类似的,我们很多做事的过程,都是面向过程,没有抽象提炼一下。如果经过进一步思考,那么可以往上再提炼一个层次,发现事物的本质:到底在做什么,我们的职责是什么,提供什么样的价值。想的更清楚,做的也会更加准确。

image

原型(Prototype):传承知识

原型模式是说,利用拷贝对象的方法,减少一些复杂的创建过程。这里我们能够学到的是,需要做好日常的积累,很多方案不是每次来都重写,是可以在原来的方案上进行拷贝复用的。这个 clone 的过程,往往也是知识传承的过程。如果有比较好的传承机制,那么会大大提升服务效率。

image

单件(Singleton):专注

单件模式是说在多线程的情况下,要保证对象只创建一遍,作为独一无二的资源。这个我觉得,应该去 review 一下我们的工作模式,虽然我们常常要并发很多事情,但是如果处处被打断,每件事都想干好,那么可能每件事都干不好。我们要确保在某个时间段竭力地做好一件事。事件是一件件有效解决的,不是一起慢慢解决的。

image

适配器(Adapter):适应能力

适配器是为了结合原来的能力,适配新的接口服务,比如适配不同的协议入口。工作的时候,其实需要适应不同的人和事,有不同的工作方法方式,但是我们的核心能力是一样的,都是解决对应的问题域。

image

桥接(Bridge):合理关系

桥接模式是将原来相互依赖的部分,通过上层接口再往抽象层提一下,减少类之间的直接合作,形成间接关系。这个到对应到工作中来说,有一种场景是,常常开发对开发去 case by case 解决问题。如果往产品逻辑层走一下,开发对产品,产品层面可能有更好的抽象。当然为了更好的服务体验,这样的解耦是不多见的,但是这样的思考我们可能要 get 一下。

image

组合(Composite):递归思考

组合模式通过继承和孩子节点,可以递归地去描述一个对象层次。这个对我们工作来说,要加深思考的层次,可以某个点拆开去再去思考,同时如果能够在递归分解过程中抽象一些共性的点,就能找到一些规律。比如我们的需求分解,每个需求可以分解为子需求,子需求再往下看又可以递归分解。分解完之后,每个部分有这部分的 owner 去驱动他的下游,形成一个层次结构。

image

装饰(Decorator):增量价值

装饰模式是将原来的能力进行包装,并提供新的行为。其实每次功能迭代,我们大多是在原来的基础上添加新的功能。我们要定义好新的能力,首要前提是继承、理解好原来的逻辑。这里还想提的是,很多时候,我们只看到了我们复用了庞大的基础能力,但是也要看到我们在项目中增量的贡献,这是我们的闪光点。不要把 “拧螺丝” 真的看成了拧螺丝。

image

外观(Facade):深入浅出

外观模式是说我们不需要理解复杂的系统,而是通过一个外观去操作。这里我们的工作思路是,我们不用展示复杂的细节,我们要提供一些高层的理解,汇报如此,系统的包装也是如此。就比如,服务功能孤立来看,可能很多、很杂,但如果有一个统一的站点去引导包装,那么感觉会好很多,也会看上去有点收口和聚焦的感觉。

image

享元(Flyweight):善于链接

享元模式是说,当我们已经存在一些内容的时候,可以通过缓存复用,而不是重新创建,减少开销。我们在工作中也要做好积累,但是更要做好缓存的 key,通过怎么样的手段去链接到我们的工作中,是需要我们做好类目管理和持续积累的。

image

代理(Proxy):理解保护

代理是为了包装一个类,对相关操作进行二次转发或者进行一些管控。工作中来说,有些工作模式下,有时候我们可能会抱怨管理者代理了我们的决策等操作,但是换个角度想,他们保护了你不用直接被暴露在业务方侧,能够按照预期内的节奏提供服务,不会被主动设置一些预期外操作或私活。

image

责任链(Chain of Responsibility):能力与责任

责任链是说将请求让队列内的处理器一个个执行,直到找到可以执行的。这里对我们工作的启示是,我们常常抱怨我们得到的机会少,不能成为队列内优先可以处理的处理器,总是处理人家不需要的。但是换个角度看,首先责任链里面的处理器应该是正交的,大家应该各司其职。退一步来说,如果真的有重叠,那么你应该努力提升自己,成为能力强的,从而提高队列内的优先级。

image

命令(Command):加强合作

命令模型是说将请求包装为命令,这样在执行的时候可以与具体的执行逻辑解耦。工作中来说,我们有时候不应该太关心一个事情是怎么完成的,当交给别人完成时,信任他们即可,就是从解决问题的角度来看,不用事事亲为,事事较真。但是这并不妨碍我们主动养成全局视角,了解每个细节。合作才能影响更多的事情。

image

解释器(Interpreter):加强理解

解释器模式是说针对一套上下文,形成一套语言,可以通过解释表达式含义的方式完成对应的任务。这里来说,我们可以形成某个团体的领域语言,内部交流通过相关领域语言交流,可以增加交流效率。此外,其实不同层次都有不同层次的专业术语,有时候一个术语的解释是一个方面的顿悟,还是要多了解工作内容本身。

image

迭代器(Iterator):横向职责

迭代器模式是将集合的访问功能独立出来,通过迭代的模式去访问。这种独立职责的操作,工作中我们常常会看到,我们会将需求管理,缺陷管理,资金安全的一些事情独立出来看。一个方面是这些功能块从主体来说是比较内聚的,另一个来方面说,对工作职责的细分,可以让大家把自己的事情干好,发挥团队作战的效能:开发把开发干好,测试把测试干好,资损防护同学把资损防护干好,整体也就做好了。

image

中介者(Mediator):协调能力

中介模式是说:当多个类之间要协调的时候,往往引入中介者进行协调,减少大家的知识成本。这个我们常常需要一些 PM、PMO 这样的角色去管理项目,系统中也需要一些协调层去协调各个域。因此我们也注重培养协调事务、具备全局观的能力。

image

备忘录(Memento):小步快跑

备忘录模式是对操作的一些记录,已被可以恢复到之前的版本。在日常工作中,我们常常需要及时备份、及时保存、及时提交等操作,这样在程序崩溃的时候可以快速恢复到之前版本。但从抽象来说,一些比较长时费力的事情,我们应该分解来做,及时锁住部分收益。

image

观察者(Observer):主观能动性

观察者模式是说我们通过注册、回掉这样的协作设计,完成变化通知的协作机制。这个工作中来说,换个角度思考,我们可以将一些被动的工作,变成主动的思考。比如:我需要干某部分工作,从工作的角度来说,不得不做,从主动的角度来说,就是需要培养某块的能力。如果对工作内容不太满意,也可以沟通协调,而不是事后爆发,凡是都是可以主观驱动的。

image

状态(State):管理自己

状态模式是说在不同的状态下,有不同的处理行为。对工作中来说,我们可能有状态好的时候,有状态不好的时候,主观的处理的手段是调整状态。但是如果调整不过来,我们应该进行不同的操作。比如,脑子好的时候,想一些复杂问题;脑子嗡嗡的时候,做一些简单整理。

image

策略(Strategy):理解决策

策略模式是说完成一个事情有不同的算法,可以进行相关切换。我们在工作中,常常会提供不同的方案,不同的方案有不同的成本和收益,但是这些方案的选择时候,往往不是我们能决定的,而是客户 client 主动判断的。

image

模板(Template):标准化能力

模版模式是说对一个执行过程进行抽象分解,通过骨架和扩展方法完成一个标准的主体逻辑和扩展。我们很多时候,做 xxx 平台也都是这样的:对过程进行标准化,对变化进行定义,形成一个平台逻辑和业务扩展,完成一个产品模版。只是说这个模版是站点,还是扩展点,还是其他的展示形式。这样标准化的能力也是需要长期训练的。

image

访问者(Visitor):学会放手

访问者模式是说把对元素的访问操作交给访问者来操作,因为对访问者来说常常有不同的访问行为。在工作中,往往我们只能陈述事实,这个内容消化后,每个人都有自己的理解。代码协作也是一样,比如:页面到底长什么样,其实还是要交还给业务本身,我们应该专注于提供基础的能力。

image

总结

作为开发者,我们对于如何写出优雅的代码,表示疑惑。因为常常背后是复杂的问题域,优雅的设计往往产生于局部,很难整体都很优雅。
作为工作者,我们对于如何做出好的表现,表示疑惑。因为背后常常是综合素质与机遇的结合,好的结果往往产生于一个阶段,长期需要较快且持续的成长。
但是,如果我们有一些指导性的原则,往往我们能够明白事务的折中点,做出更加合理的设计,以及更加关键的贡献。

@bingoohuang
Copy link
Owner Author

Interface Segregation Principle

图片来自

image

Why

When working with interfaces, you may find that you have an interface that is implemented by various clients, but we're not all clients need to implement all the methods of the interface. This is bad because you’re forcing clients on to implement methods they don’t need, leaving empty methods like this:

func (c Client) MethodTheClientDontNeed() {  
    panic("implement me") 
}

What

The Interface Segregation is part of the SOLID principles, and what it says is that the clients of an interface must implement only the methods that they need, or else you must split your interface into more specific ones, so the clients only implement the methods that they need.

image

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant