设计模式
Keras深度学习
纯属个人记点笔记,方便需要用的时候查看。
展开
-
C++23种设计模式(21)-访问者模式
访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。#include <iostream>#include <list>#原创 2021-11-04 10:07:20 · 62997 阅读 · 0 评论 -
C++23种设计模式(20)-状态模式
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。本文的例子为第一种情况,以战争为例,假设一场战争需经历四个阶段:前期、中期、后期、结束。当战争处于不同的阶段,战争的行为是不一样的,也就说战争的行为取决于所处的阶段,而且随着时间的推进是动态变化的。#include <iostream>#in原创 2021-11-04 10:06:59 · 63196 阅读 · 0 评论 -
C++23种设计模式(19)-备忘录模式
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]。举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。#include <iostream>#include <list>#include<vec原创 2021-11-04 10:06:39 · 62981 阅读 · 0 评论 -
C++23种设计模式(23)-解释器模式
解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。#include <iostream>#include <list>#include<vector>#include<string>using namespac原创 2021-11-04 10:09:20 · 63233 阅读 · 0 评论 -
C++23种设计模式(22)-中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。本文就以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知原创 2021-11-04 10:07:39 · 63030 阅读 · 0 评论 -
C++23种设计模式(17)-职责链莫斯
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。#include <iostream原创 2021-11-04 10:06:02 · 62949 阅读 · 0 评论 -
C++23种设计模式(18)-命令模式
命令模式,是将一个请求封装为一个对象,从而使我们可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。#include <iostream>#include <list>using namespace std;// Receiver类,知道如何实施与执行一个与请求相关的操作:class Receiver {public: void Action() { cout << "Receiver" << endl; }原创 2021-11-04 10:06:23 · 63101 阅读 · 1 评论 -
C++23种设计模式(16)-迭代子模式
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。当一家公司发展到足够大,需要陆续的合并或收购其他公司,但保持原有公司的人力架构。对于总公司的HR,需要面对不同的人力系统,当要统计各子公司各部门的人力信息时,比较困难。每收购一家公司,都需要熟悉一套新的人力系统。但当每套人力系统对外暴露的统计方式一致时,HR就不需要关心各子公司具体的人力架构。#include <iostream>#include <string&g原创 2021-11-04 10:05:26 · 63032 阅读 · 0 评论 -
C++23种设计模式(15)-观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。#include<iostream>#include<string>#include&原创 2021-11-03 16:23:20 · 63272 阅读 · 0 评论 -
C++23种设计模式(14)-模板方法模式
最近有个招聘会,可以带上简历去应聘了。但是,其中有一家公司不接受简历,而是给应聘者发了一张简历表,上面有基本信息、教育背景、工作经历等栏,让应聘者按照要求填写完整。每个人拿到这份表格后,就开始填写。如果用程序实现这个过程,该如何做呢?一种方案就是用模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。#include<iostream>#include<string>#include<l原创 2021-11-03 16:13:44 · 62885 阅读 · 0 评论 -
C++23种设计模式(13)-策略模式
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。下面以高速缓存(Cache)的替换算法为例,实现策略模式。#include<iostream>#include<string>#include<list>#include<vector>using namespace std;原创 2021-11-03 16:08:30 · 63001 阅读 · 0 评论 -
C++23种设计模式(12)-享元模式
运用共享技术有效地支持大量细粒度的对象。在围棋中,棋子就是大量细粒度的对象。其属性有内在的,比如颜色、形状等,也有外在的,比如在棋盘上的位置。内在的属性是可以共享的,区分在于外在属性。因此,可以这样设计,只需定义两个棋子的对象,一颗黑棋和一颗白棋,这两个对象含棋子的内在属性;棋子的外在属性,即在棋盘上的位置可以提取出来,存放在单独的容器中。相比之前的方案,现在容器中仅仅存放了位置属性,而原来则是棋子对象。显然,现在的方案大大减少了对于空间的需求。#include<iostream>#inc原创 2021-11-03 16:00:20 · 62796 阅读 · 0 评论 -
C++23种设计模式(11)-组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。#include<iostream>#include<string>#include<l原创 2021-11-03 15:43:22 · 62764 阅读 · 0 评论 -
C++23种设计模式(10)-桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。#include<iostream>#include<string>using namespace std;//操作系统class OS{public: virtual void I原创 2021-11-03 15:32:28 · 63107 阅读 · 0 评论 -
C++23种设计模式(9)-外观模式
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。DP一书的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口原创 2021-11-03 15:25:14 · 63086 阅读 · 0 评论 -
C++23种设计模式(8)-代理模式
为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。本文主要介绍虚代理和智能引用两种情况。#include<iostream>#include<string>using namespace std;class Image{public: Image(string name) : m_imageName(name) {} virtual ~Image() {} virtual void Sho原创 2021-11-03 15:18:33 · 63187 阅读 · 0 评论 -
C++23种设计模式(7)-装饰器模式
装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。代码如下:#include<iostream>#include<string>using namespace s原创 2021-11-03 15:06:00 · 63130 阅读 · 0 评论 -
C++ 23种设计模式(6)-适配器模式
适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包括类适配器和对象适配器,本文针对的是对象适配器。举个例子,在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,前端删除。而栈用到了它的后端插入,后端删除。假设栈和队列都是一种顺序容器,有两种操作:压入和弹出。原创 2021-11-03 14:49:38 · 63105 阅读 · 0 评论 -
C++23种设计模式(5)-原型模式
原型模式的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。下面给出原型模式代码:#include<iostream>using namespace std;//父类class Resume{protected: char *name;public: Resume() {} virtual ~Resume() {} virtual Resume* Clone() { return NULL; } virtual void Set(char *n)原创 2021-11-02 15:30:24 · 62916 阅读 · 0 评论 -
C++23种设计模式(4)-建造者模式
建造者模式将一个复杂的对象与它的表示分离,例如建造一个人,这个人有头部和躯体,然后人分为瘦人和胖人,最后指挥官指挥人进行活动,这个指挥的要么是瘦人,要么是胖人。#include<iostream>using namespace std;//建造者模式class Builder {public: virtual void BuildHead(){} virtual void BuildBody(){}};//构造瘦人class ThinBuilder :public Bu原创 2021-11-02 11:22:58 · 62951 阅读 · 0 评论 -
C++23种设计模式(3)-单例模式
单例模式,就是这个类只能存在一个实例对象,不能创建多个。代码如下:#include<iostream>using namespace std;class Singleton{public: static Singleton* GetInstance();protected: //单例模式的构造函数放在保护中,使得子类可以访问 Singleton() {}private: //唯一实例的指针 static Singleton* singleton;};Single原创 2021-11-02 10:21:01 · 62893 阅读 · 0 评论 -
C++23种设计模式(2)-抽象工厂模式
在工厂方法模式下,如果一家公司既能生产单核的,又能生产多核的,那么简单工厂模式和工厂方法模式就无法满足要求,这个时候就需要使用抽象工厂模式了。#include<iostream>#include<string>using namespace std;enum CTYPE{COREA,COREB};//定义一个基类单核class SingleCore {public: virtual void show() = 0;};//单核Aclass SingleCor原创 2021-10-29 17:31:14 · 63022 阅读 · 0 评论 -
C++23种设计模式(1)-工厂方法模式
为了引入工厂方式模式,我们首先来看一个简单工厂模式,注意简单工厂模式不属于23种设计模式之一,因为简单工厂模式是有缺陷的。下面来看一个简单工厂模式例子。#include<iostream>#include<string>using namespace std;enum CTYPE{COREA,COREB};//定义一个基类单核class SingleCore {public: virtual void show() = 0;};//单核Aclass Singl原创 2021-10-29 17:13:13 · 63633 阅读 · 0 评论