设计模式实现
文章平均质量分 55
设计模式实现
shortBackboard
软件工程专业在读。
保持热爱,不断进步。
展开
-
C++访问者模式:Visitor Pattern
访问者模式:使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。通俗来说就是:不同的人对同一件事情有着不同的处理方式。访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作。使得在不改变各元素类的前提下,能定义作用于这些元素的操作。该模式适合数据结构相对稳定且算法又易变化的系统。数据结构是被访问者,算法操作相当于访问者。原创 2023-09-21 18:02:42 · 35 阅读 · 0 评论 -
C++原型模式:Prototype Pattern
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式。原型模式的核心思想是,通过拷贝指定的“原型实例(对象)”,创建跟该对象一样的新对象。简单理解就是“克隆指定对象”。这里提到的“原型实例(对象)”,就是被克隆的对象,它的作用就是指定要创建的对象种类。原创 2023-09-21 15:48:22 · 28 阅读 · 0 评论 -
C++备忘录模式:Memento Pattern
3.数据库事务管理:当执行数据库操作时,我们可以将当前数据库的状态保存到备忘录对象中,在回滚操作或者发生错误时,可以使用备忘录对象恢复到之前的数据库状态。它创建一个备忘录对象,用于存储当前对象的状态,也可以使用备忘录对象恢复自身的状态。3.管理者(Caretaker):负责保存备忘录对象,但不能修改备忘录对象的内容。备忘录对象可以包括一个或多个状态属性,源发器可以根据需要保存和恢复状态。又称快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,之后就。原创 2023-09-20 21:04:28 · 34 阅读 · 0 评论 -
C++中介者模式:Mediator Pattern
生活中最常见的例子就是租房中介,如果我们想要租房可以通过中介和房东沟通,这时候其实并不需要知道房东是谁,也并不需要面对面,类似于电话、QQ、微信等等都是中介,能大大降低了沟通的复杂性。在公司中职员、组长、经理和老板之间有时会有相互的发送通知,此时可以使用中介者模式来方便之间的交流。具体中介者类中包含了各个同事类之间的交互细节,可能会导致具体中介者类非常复杂;(Mediator Pattern)又被称为。中介者使各个对象之间不需要显式地相互引用,封装一系列对象之间的交互关系。从而使各个对象之间耦合性降低,原创 2023-09-20 17:24:52 · 49 阅读 · 0 评论 -
C++解释器模式:Interpreter Pattern
但是,解释器模式的缺点也很明显,由于每个语法规则都需要对应一个解释器,因此解释器模式在解析复杂语句时会造成类膨胀和系统性能下降。非终结符解释器(Nonterminal Expression Interpreter):非终结符解释器用于解释一个语法规则,对应语法树中的非叶子节点,比如算术表达式、逻辑表达式等。终结符解释器(Terminal Expression Interpreter):终结符解释器用于解释语言中的基本单位,对应语法树中的叶子节点,比如变量、常量等。原创 2023-09-20 16:00:06 · 32 阅读 · 0 评论 -
C++蝇量模式:Flyweight Pattern
它是一种对性能进行优化的设计模式,通过复用蝇量对象(大量类似的对象),降低系统的内存压力(复用减少对象总数)和CPU压力(复用避免了对象的实例化,有些对象的实例化是耗时操作)。所以,需要注意的是,无可共享内部状态的对象,也是可以进行复用的(只复用不享元)。在蝇量模式中,球工厂在创建球时,即以共同大小创建球,然后交给Client,在Clinet中根据需求,对球赋予不同的颜色。指,不共享的部分,外部状态将在Client中,根据环境赋予不同的值。“大小”即为球对象的内部状态,“颜色”即为球对象的外部状态。原创 2023-09-20 09:49:20 · 29 阅读 · 0 评论 -
C++责任链模式:Chain of Responsibility Pattern
通过责任链模式,你可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。链中的每个对象扮演处理器,并且有一个后继对象。假设我们要对考试分数(百分制)进行不同等级的处理,主要分为A、B、C、D、E五级形成一条责任链,各个成员按照分数区间处理该分数,如果不属于该成员的处理范围就传送给它的后继对象处理。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。当你想要让一个以上的对象有机会能够处理某个请求的时候,就可以使用责任链模式。原创 2023-09-19 11:07:21 · 28 阅读 · 0 评论 -
C++建造者模式:Builder Pattern
建造者模式又称为生成器模式,主要用于对复杂对象的构建、初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象。我们来整理一下思路,首先,不管客户的需求是什么样子的,汽车的功能是不会变的,永远都有启动、发动引擎、鸣笛和停车的功能,所以,我们可以把这些共有的行为抽象到父类定义,具体怎么实现交给子类去实现即可。但是不同的人使用汽车的习惯可能不同,比如张三习惯启动后先按一下喇叭,而李四习惯先按下喇叭在启动,这就导致上面的程序不能同时满足两人的要求。建造者模式:创建一种类型的。原创 2023-09-18 21:08:35 · 60 阅读 · 0 评论 -
C++桥接模式:Bridge Pattern
如图形既可按形状分,又可按颜色分。如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。本实例按用途分可选钱包(Wallet)和挎包(HandBag),按颜色分可选黄色(Yellow)和红色(Red)。女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,使用桥接模式,不只改变你的实现,也改变你的抽象。原创 2023-09-18 19:17:54 · 47 阅读 · 0 评论 -
C++复合模式:Compound Pattern
注:是为了解决一般或重复发生的问题,而不是简单的认为使用了多个模式就是复合模式;模式通常被一起使用,并被组合在同一个设计解决方案中。复合模式在一个解决方案中。MVC模式(Model-View-Controller):模型-视图-控制器。MVC是由多个设计模式结合起来的模式。绝不要为了使用模式而使用模式;一般或重复发生的问题。原创 2023-09-17 20:40:51 · 38 阅读 · 0 评论 -
C++代理模式:Proxy Pattern
代理模式:为另一个对象提供一个替身或者占位符以控制对这个对象的访问。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。案例:假设你想购买一款华为新出的手机,但是你不知道手机的真假,这时可以通过手机代理来帮你检验手机的真假并帮你购买新出的手机。代理需要做的:控制和管理访问;需要时可以扩展目标对象的功能;被代理的对象可以是远程的对象或需要安全控制的对象等。抽象的主题(subject):购物。subject:抽象的主题;realSubject:买家。原创 2023-09-16 19:19:33 · 27 阅读 · 0 评论 -
C++状态模式:State Pattern
我们都知道,http请求报文由请求行、请求头、请求空行和请求体四部分组成,服务器在解析请求报文时,会根据当前所在行的状态来进行不同方式的解析(逐行解析)。状态模式是有限状态机(Finite State Machine)的一种实现方式。状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来好像修改类它的类。原创 2023-09-16 16:07:22 · 33 阅读 · 0 评论 -
C++组合模式:Composite Pattern
组合模式:允许将对象组合成树形结构来表现“整体/部分”层次结构,组合能让客户以统一的方式处理个别对象以及对象组合。我们称包含其他组件的组件为组合对象(文件夹),而没有包含其他组件的组件为叶节点对象(文件)。原创 2023-09-16 10:41:56 · 38 阅读 · 0 评论 -
C++迭代器模式:Iterator Pattern
案例:各个学院有不同的专业,假如计算机学院用数组存储不同的专业,然而数学学院是用链表存储的,其他的学院可能还使用其他不同的数据结构来存储。客户端要遍历各个学院的所有专业就很麻烦,不同的数据类型需要不同的方式来遍历。不同专业的类型都是字符串类型,但是存储的数据结构不同。假设计算机学院使用数组存储,数学学院使用链表存储。把数组和链表的不同遍历方式封装到hasNext和next函数中,用户看不出其他的不同。迭代器模式,提供一种统一的方法顺序访问一个聚合对象中的各种元素,而又。原创 2023-09-14 22:35:12 · 28 阅读 · 0 评论 -
C++模板方法模式:Template Method Pattern
模板方法模式在一个方法中定义一个算法的框架,而将一些步骤的实现延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。比如在案例中,加入一个默认对饮料进行打包的默认钩子方法(pack()),但是子类可以通过重写不打包饮料。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。两者的共同成分是什么?模板方法类中可以有一个hook(钩子)方法,但只有空的或者默认的实现。3.这个模板方法提供了一个框架,方便其他类的咖啡因饮料加入;4.模板类只专注在算法本身,而由子类提供完整的实现;原创 2023-09-14 18:09:48 · 34 阅读 · 0 评论 -
C++外观模式:Facade Pattern
外观模式:将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易使用。案例:假设你现在准备挑选一部DVD影片准备观看,你需要做一系列的步骤:将灯光调暗、放下屏幕、打开投影机、将投影机切换到DVD模式、播放视频等等。注意:1.外观模式只是简化了接口,并没有把子系统的接口封装起来。如果需要,也可以直接去访问子系统的接口。2.外观不仅是简化了接口,也将客户从组件的子系统中解耦。原创 2023-09-13 19:34:37 · 40 阅读 · 0 评论 -
C++适配器模式:Adaptor Pattern
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。在国外使用国内的电脑,就需要使用适配器,将国外的插座的电流转换成国内电脑可以使用的电流。在面向对象设计中,适配器就是将一个接口转换成另一个接口,以符合客户的期望。它就像一个中间人,在无法交流的双方之间起一个桥梁作用。原创 2023-09-12 14:51:37 · 29 阅读 · 0 评论 -
C++命令模式:Command Pattern
比如说,遥控器在出厂时肯定没有设置有意义的命令对象,就可以使用NoCommand对象作为代用品,当调用它的execute()方法时,这种对象什么事情都不做。如果遥控器上的每个按钮都存储一个命令对象,当按钮被按下的时候,就可以请命令对象做相关的工作。再比如,在餐厅点菜,一张订单封装了准备餐点的请求,服务员不需要知道订单上有什么,也不需要知道谁来准备订单上的餐点,她只需要把订单交给后厨(现实生活服务员可能不是这样)。案例:设计一个遥控器来控制不同类型的装置,比如热水器,空调,每个装置的具体步骤方法不一样。原创 2023-09-11 21:34:48 · 44 阅读 · 0 评论 -
C++单例模式:Singleton Pattern
通过调用getInstance()静态方法来获取对象,由于是静态方法,所以可以在任何需要单例对象的时候来获得它。单例模式:确保一个类只有一个实例,保证内存中任何情况下最多只有一个实例,并提供一个全局访问点。单例模式的类的构造函数是。原创 2023-09-10 21:28:44 · 37 阅读 · 0 评论 -
C++抽象工厂模式:Abstract Factory Pattern
案例:在上一章节工厂方法模式的基础上,将披萨的各种原料生产抽象成一个AbstractProduct类(这个抽象的产品类可以有多个)。对于披萨原料生产产品家族(crust工厂、sugar工厂、milk工厂等),每个工厂都有不同的实现。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。抽象工厂模式的一个优点是把一群相关的产品(披萨的各种原料的不同配方)集合起来。抽象工厂模式:提供接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂模式是工厂方法模式的升级版本,原创 2023-09-10 09:51:39 · 32 阅读 · 0 评论 -
C++工厂方法模式:Factory Method Pattern
假设现在我们准备开一家披萨店,不同种类的披萨都有相同的一套制作流程:被准备、被烘烤、被切片、被装盒,但是不同的披萨有不同的口味和添加不同的配料比如cheese、veggie等。随着业务的扩展,来自不同地方的风味各异的披萨店准备来加盟,它们有不同的风味但是需要添加的配料还是相同。当需要新增产品时,都必须要编写新的具体产品类,而且还要提供与之对应的具体工厂类,随着类的不断增加,在一定程度上增加了系统的复杂度,会有更多的类需要编译和加载,会给系统带来一些额外的开销。方便不同的对象需要时通过工厂来获取对象。原创 2023-09-08 21:21:37 · 44 阅读 · 0 评论 -
C++装饰者模式:Decorator Pattern
假设在一家咖啡饮料店中,有饮料Decaf(低咖)、Tea(茶) 和可以添加的调料比如milk、mocha、sugar等,不同的用户可能会购买不同组合的饮料,并且在后续的营业中可能会出现新的饮料或者调料,现需要计算不同饮料的最终价格。要让调料类可以引用到饮料类,做法:把饮料作为调料的构造器的参数,将饮料保存到调料的成员变量中。装饰者可以在所委托被装饰者的行为之后加上自己的行为,以达到特定的目的。也就是有相同的超类,因为装饰者新的行为必须能取代被装饰者。装饰者和被装饰者必须是一样的类型,原创 2023-09-07 20:54:28 · 47 阅读 · 0 评论 -
C++观察者模式:Observer Pattern
注:另外一种实现为把getTemperature() 和 getHumidity() 放在WeatherData类中,update()函数的参数为(int temperature, int humidity);观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。主题对象不知道观察者的细节,只知道观察者实现了主题对象接口。后续新增的观察者可以通过注册成为主题对象的观察者,也可以通过操作使自己不再是该主题对象的观察者。报纸的订阅者发送信息。原创 2023-09-05 12:06:41 · 35 阅读 · 0 评论 -
C++策略模式:Strategy Pattern
假设现有一个Duck类,有相同的行为,比如quack()、swim();同时不同的Duck类表现出不同的行为,比如不同的Duck类的display()的外观颜色不同、有的Duck会fly(),然而有的不会。同时要求在运行的过程中改变Duck类的某些行为,比如颜色从红色变为白色。,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。聚合(Aggregation):聚合的整体和部分之间。封装到具有共同接口的独立的类中。(整体的一端)的实线来表示。(整体的一端)的实线表示。算法(类的一组行为)原创 2023-09-04 20:29:22 · 64 阅读 · 1 评论