设计模式
学习设计模式的一些理解和笔记。
slowlytalk
正经程序员.
展开
-
装饰者模式(Decorator)-设计模式(十五)
作用:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。简单的来说,就是已经有一个类了,这个类中有一些功能,现在想给这个类多增加几个功能,使这个类的功能更强大。举个例子:麦当劳的炸鸡腿很好吃,但有些客户总是喜欢在炸鸡腿上挤上一些芝士,那才是人间美味,这样,在制作炸鸡腿之后,才需要挤芝士,因此挤芝士这个动作可以看作是后续对整个炸鸡腿的装饰。装饰模式和适配器模式的关系:相同点:两者都是包装模式,都是通过封装其他的对象达到设计的目的。不同点:理想的装原创 2020-06-08 22:15:58 · 236 阅读 · 0 评论 -
迭代器模式(Iterator)- 设计模式(十四)
文章目录作用举个例子优点缺点使用场景注意事项UML 结构图例子运行结果作用提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。简单的来讲,就是提供了一个索引,这个索引只能顺序的访问,并且不知道该对象的内部表示。比如我们经常用到的for循环语句,一般用作遍历数组,其中的 ++i;其作用是每次循环之后i的值加1,这样就能访问下一个(下下一个)数组中的元素,也就是从头至尾的遍历了数组。将i抽象化后并使其能够通用,则就形成了iterator模式。迭代器模式是每个程序员无意之间接触最早的设原创 2020-06-02 20:02:30 · 241 阅读 · 0 评论 -
策略模式(strategy)- 设计模式(十三)
文章目录作用举个例子优点缺点与其他设计模式的区别UML 结构图例子作用定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说,从表面上看,这一系列的算法实现相同的功能,提供一样的接口,是可以相互替换的,但是每个算法的内部实现可能不一样。简而言之一句话,Strategy 模式是对算法的封装。处理一个问题的时候可能有多种算法,这些算法的接口 (输入参数,输出参数等)都是一致的,那么可以考虑采用Strategy 模式对这些算法进行封装,在基类中定义一原创 2020-06-01 10:50:46 · 230 阅读 · 0 评论 -
职责链模式(ChainOfResponsibility) -设计模式(十二)
作用:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个栗子:去麦当劳点餐,点了一个麦香鸡腿,麦当劳制作工作人员有很多,这个麦香鸡腿可能由任何一个工作人员制作,但我们并不知道是由谁去制作的,我们只关心鸡腿有没有被制作。古代皇帝召见某位大臣时,一般是由龙椅旁边的宦官进行喊话,然后一个一个的接着喊下去,最后直到找到这位大臣为止,而皇帝并不知道是由哪一位宦官找到这位大臣的。发出请求的客户端并不知道请求最终由原创 2020-05-23 15:24:39 · 193 阅读 · 0 评论 -
代理模式(Proxy)-设计模式(十一)
1、作用为其他对象提供一种代理以控制对这个对象的访问。 简单的说,就是客户端和目标端之间的中介。举个例子:房东出租房子,但懒得自己找租客,因此找了中介,由中介代理租房,租客租房子,直接找不到房东,通过中介找房东租房子,这个中介可以看作是代理。优点:通过一个代理对象完成一系列的操作处理,在以后的改动中,就会允许操作对象(动态修改、添加等),符合开放封闭原则代理模式协调了调用者和被调用者,降低了代码的耦合度, 扩转性较好可以以小对象代理大对象,减少消耗(虚拟代理)代理场景:远程代理:也就原创 2020-05-19 21:10:16 · 217 阅读 · 0 评论 -
状态模式(State)-设计模式(九)
1、作用允许一个对象在其内部状态改变时改变它的行为。每个人、事物在不同的状态下会有不同的表现,而一个状态在不同的表现下会转换为另一个状态。举个例子:我们去买一杯奶茶,有热饮、冷饮、和常温三种可供选择,我们首先选择了常温的,在奶茶开始制作的时,抬头看了看天气,现在烈日炎炎,想想一杯冰凉的奶茶是不是能够按下躁动的心,因此立马决定告诉店员,我需要改成冷饮,而店员呢,也就需要改变奶茶的制作流程。2、解决的问题我们在搬砖中经常会遇到几种状态的选择,比如简单的鼠标的三种状态,遇到这种情况时,通常的方式是使用原创 2020-05-19 08:51:32 · 198 阅读 · 0 评论 -
TemplateMethod模式-设计模式(十)
作用: 定义一个操作中的算法的骨架, 而将一些步骤延迟到子类中。 TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 嗯,还是以鸡腿为例来说一下这个方法。 啃得鸡现在要炸鸡腿,炸鸡腿呢我们就把它当做是个模板,怎么炸?当然不同的口味有不同的炸法嘛;因此我们在炸各种口味的鸡腿就可以在派生类里实现了嘛。 看一个例子:#includeusin原创 2019-05-23 20:15:44 · 183 阅读 · 0 评论 -
桥接模式(Bridge )-设计模式(七)
作用: 将抽象部分与它的实现部分分离, 使它们都可以独立地变化。 解析: Bridge 用于将表示和实现解耦,两者可以独立的变化.在 Abstraction 类中维护一个 Implementor 类指针, 需要采用不同的实现方式的时候只需要传入不同的Implementor 派生类就可以了. Bridge 的实现方式其实和 Builde 十分的相近,可以这么说:本质上是一样的, 只是封装的东西原创 2016-10-08 17:24:49 · 388 阅读 · 0 评论 -
组合模式(composite)-设计模式(八)
一、作用: 将对象组合成树形结构以表示”部分-整体”的层次结构。 Composite 使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 组合模式让你可以优化处理递归或分级数据结构。有许多原创 2016-10-17 14:29:31 · 422 阅读 · 0 评论 -
抽象工厂模式(AbstractFactory)-设计模式(二)
作用: 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们具体的类。 抽象基类: 1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一 个实现. 2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现. 接口函数: 1)AbstractFactory::CreateProductA 和 Abstra原创 2016-08-15 10:39:26 · 918 阅读 · 2 评论 -
工厂模式(Factory)-设计模式(一)
作用: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使一个类的实例化延迟到其子类。 工厂模式可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式;在本节,我们来讨论一下简单工厂模式和工厂方法模式。简单工厂模式: 举个简单的例子: 肯德基可以出售两种不同风味的鸡腿,具体卖哪一种呢?由客户决定该给客户卖哪一种。下面给出一个简单的实现用例。#inc原创 2016-08-12 13:18:59 · 403 阅读 · 0 评论 -
适配器模式(Adapt)-设计模式(六)
作用: 将一个类的接口转换成客户希望的另外一个接口。 Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 解析: Adapt 模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能. 实现: Adapt 模式有两种实现办法,一种是采用继承原有接口类的方法,一种是采用组合原有接口类的方法 接下来看一下实现吧原创 2016-09-13 15:02:37 · 707 阅读 · 0 评论 -
单例模式(Singleton)-设计模式(五)
单例模式我觉得就是唯一性,个人认为 Singleton 模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。 作用:保证一个类仅有一个实例, 并提供一个访问它的全局访问点。 解析: Singleton 模式其实是对全局静态变量的一个取代策略,上面提到的Singleton 模式的两个作用在 C++中是通过如下的机制实现的: 1)仅有一个实例,提供一个类的静态成员变量,大原创 2016-08-31 10:59:34 · 419 阅读 · 0 评论 -
原型模式(prototype)-设计模式(四)
这段时间一直在忙Qt封装串口的问题,设计模式就一直搁浅了,今天来看一下原型模式,当然,没有太多意义的解析还是有一堆的: 作用: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 抽象基类: l)Prototype:虚拟基类, 所有原型的基类,提供 Clone 接口函数 接口函数: 1) Prototype::Clone 函数:纯虚函数, 根据不同的派生类来实例化创建对象原创 2016-08-31 09:44:44 · 398 阅读 · 0 评论 -
建造者模式(Builder)-设计模式(三)
今天我们来学习建造者模式,首先当然是一大堆基本没意义的解析: 作用: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 适用于以下情况: 1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2)当构造过程必须允许被构造的对象有不同的表示时。 抽象基类: 1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数原创 2016-08-16 11:17:20 · 463 阅读 · 0 评论