- 博客(69)
- 资源 (1)
- 收藏
- 关注
原创 执行命令——命令模式
命令模式命令模式UML在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式#pragma once#include <iostream>#include <vector>#include <string>#include &
2022-05-08 19:21:29
263
原创 组合才是真谛——桥接模式
桥接模式桥接模式UML桥接模式是指将抽象部分和实现部分以“组合”的方式分离#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;//桥接模式//实现类(我们来抽象手机功能举例)class PhoneSys {public: virtual void func() =
2022-05-08 18:15:06
423
原创 你就是唯一——单例模式
单例模式单例模式UML通过单例模式的方法创建的类在当前进程中只有一个实例#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;//单例class Singleton{private: Singleton(string n):name(n){} string name
2022-04-23 16:42:21
360
原创 光标——迭代器模式
迭代器模式迭代器模式UML迭代器有时又称光标,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。
2022-04-21 21:09:50
346
原创 团队管理——组合模式
组合模式组合模式UML组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;//层级抽象节点class abstruct_node{public: virtual void add(abstruct_node
2022-04-17 16:54:02
350
原创 保存存档——备忘录模式
备忘录模式备忘录模式UML备忘录模式是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;//备份数据class SaveDate{public: Sa
2022-04-17 11:21:58
322
原创 强扭的瓜——适配器模式
适配器模式适配器模式UML适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;//抽象接口(客户
2022-04-16 23:26:50
162
原创 上buff——状态模式
状态模式状态模式UML状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。#pragma once#include <iostream>#include <vector>#include <string>#include <Windows.h>using namespace std;class Context;//抽象状态类class
2022-04-16 18:51:53
300
原创 方便面工厂——抽象工厂模式
抽象工厂模式抽象工厂模式UML工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。...
2022-04-16 11:41:05
320
原创 放哨——观察者模式
观察者模式观察者模式UML观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2022-04-13 20:30:09
341
原创 他好像那个谁啊——建造者模式
建造者模式建造者模式UML建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。#pragma once#include <iostream>#include <Windows.h>using namespace std;//建造部件(防具)class Armor{public: void role(){ cout << "穿上护甲" << endl;}};//建造部件(武
2022-04-11 20:36:54
433
原创 领导者——外观模式
外观模式UML外观模式更像是公司中的管理模式。外观类就像是领导者,分配管理着下属的工作。#pragma once#include <iostream>#define SAFE_DELETE(ptr) if(ptr!=NULL){delete ptr; ptr = NULL;}using namespace std;//下属类class Member_A{public: void CanDo() { cout << "前端开发a" << e.
2022-04-10 21:54:24
456
原创 解题公式——模板方法模式
模板方法模式模板方法模式UML模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。#pragma once#include <iostream>#define SAFE_DELETE(ptr) if(ptr!=NULL){delete ptr; ptr = NULL;}using namespace std;//抽象模板(当做是老师教的解题模板)class TempLate{pu
2022-04-10 15:34:18
319
原创 复制粘贴——原型模式
原型模式原型模式UML原型模式就是通过拷贝某个实例数据成员,来创建一个新的完全一样的实例。(原型模式通常在Java、C#中提及;而C++通过拷贝构造函数就可以实现,只要注意浅拷贝、深拷贝即可。)浅拷贝、深拷贝 在C++构造函数中如果没有自己实现拷贝构造函数,那么编译器会自动生成合成的拷贝构造函数(浅拷贝)。 当我们的Class数
2022-04-10 11:47:19
792
原创 进工厂——工厂方法模式
工厂方法模式工厂方法模式UML工厂方法模式是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的#pragma once#include <iostream>#define SAFE_DELETE(ptr) if(ptr!=NULL){delete ptr; ptr = NULL;}using namespace std;//抽象产品class Product{p
2022-04-09 22:41:52
102
原创 中间商——代理模式
代理模式代理模式UML代理模式是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。#pragma once#include <iostream>#define SAFE_DELETE(ptr) if(ptr!=NULL){delete ptr; ptr = NULL;}using namespace std;//抽象接口class Subject{public
2022-04-09 18:05:43
470
原创 从头开始——简单工厂模式
简单工厂模式简单工厂模式UML简单工厂模式的实质是通过给工厂传入参数,动态的创建对应产品类对象(这些产品类继承自一个父类或接口)#pragma once#include <iostream>#define SAFE_DELETE(ptr) if(ptr!=NULL) delete ptr using namespace std;//产品基类class Product{public: virtual void Operator() = NULL;};//产
2022-04-05 00:11:10
351
原创 破“哈希”式
哈希表哈希表有点像我们上学的时候按学号分小组,通过这种方式老师可以很轻松的下达任务,或者很快的发现谁没交作业(一个班的作业很难一眼看出少了几本,但是一个组就那么几本作业,少了一两本一眼就看出来了)。如图将24人分成6组这种编号的方式就是高效的散列,我们俗称“哈希”!以上过程是通过把关键码值 key(编号)映射到表中一个位置(数组的下标)来访问记录,以加 快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希链表的算法实现哈希链表数据结构的定义#define DEFAULT
2020-07-12 22:30:53
162
原创 破“树”式
树树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除 了根结点外,每个子结点可以分为多个不相交的子树;二叉树一个没有限制的线性表应用范围可能有限,但是我们对线性表进行一些限制就可 以衍生出非常有用的数据结构如栈、队列、优先队列等。...
2020-07-12 15:15:29
357
原创 破“栈”式
栈的原理如同图里的小汽车是排成一条直线,是线性排列,而且只能从一端进出,后进的汽车先出去,后进 先出(Last In First Out,LIFO),这就是"栈"。栈也是一种线性表,只不过它是操作受限的线性 表,只能在一端操作。 进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储。...
2020-07-10 16:21:46
244
原创 破“堆”式
堆的特征依据以上特征,我们一起看看能不能找到下面那个是真正的最大堆,看看你到底有没有火眼金睛!结果是:只有C是最大堆;A、B不是最大堆的原因你发现了吗?还没发现再回顾一下堆的特征。 堆的原理高能:堆是你见过的最有个性的树!它是用数组表示的树!其特征满足二叉树!在数组中快速创建堆1. 首先我们需要找到最后一个结点的父结点如图(a),我们找到的结点是 87,然后找出该结点的最大子节点与自 己比较,若该子节点比自身大,则将两个结点交换. 图(a)中,87 比左子节点 95 小,则交换之
2020-07-04 17:10:15
159
原创 破“队”式(一)
队列的原理队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)
2020-06-25 20:35:27
160
原创 破“链”式
之前我们学习了顺序表,但是,每次移除一颗星星导致 其后的所有元素都向前移动并不是一种高效的做法,如果不止几十颗星星,而是有成千上万 颗星星,每删除一颗,无异于是对数据进行乾坤大挪移(同样,插入也是如此)…...
2020-06-03 17:24:03
335
2
原创 破“顺”式
顺序表的原理顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以 快速定位第几个元素,中间不允许有空值;插入、删除时需要移动大量元素。顺序表的三个要素:① 基地址② 分配一段连续的存储空间 (实际的存储空间大小)③记录实际的元素个数(即顺序表的长度)//顺序表结构体定义#define MAX_SIZE 100 typedef int ElemType;struct _SqList{ ElemType *elems; // 顺序表的基地址 int
2020-05-31 23:18:27
178
原创 千人千面——多态(二)
虚函数的原理-虚函数表单个类的虚函数表#include <iostream>using namespace std;class Father {public: virtual void func1() { cout << "Father::func1" << endl; } virtual void func2() { cout <<...
2020-04-16 20:52:51
216
原创 千人千面——多态(一)
为什么要使用多态特性 就像人一样,我们从前代继承下来的技能可能不是最完善的,但是后代通过不断的改良、升级,如此反复循环人类社会才能发展至如今的地步。程序也验证了这一点,没有人的程序可以一步到位,一下子就写出一个无可挑剔的程序,都是在原先的基础上反复改进、升级、版本迭代。所以程序只有更完美没有最完美!多态的出现帮我们更容易去实现这个过程。Demo.cpp#include <iost...
2020-04-16 18:25:09
340
原创 万物可运算——运算符重载(四)
重载赋值运算符Boy.h#pragma once#include <string>class Boy{public: Boy(const char* name=NULL, int age=0, int salary=0, int darkHorse=0); ~Boy(); Boy& operator=(const Boy& boy); std::s...
2020-04-16 11:16:19
204
原创 万物可运算——运算符重载(三)
运算符重载的禁区和规则1.为了防止对标准类型进行运算符重载,C++规定重载运算符的操作对象至少有一个不是标准类型,而是用户自定义的类型 比如不能重载 1+2 但是可以重载 cow + 2 和 2 + cow // cow是自定义的对象2.不能改变原运算符的语法规则, 比如不能把双目运算符重载为单目运算3.不能改变原运算符的优先级4...
2020-04-15 18:57:39
213
原创 万物可运算——运算符重载(二)
为什么要使用运算符重载C/C++的运算符,支持的数据类型,仅限于基本数据类型。那么类与类之间可以进行加减乘除等运算吗?一般来说C++是做不到的,但是我们可以通过运算符重载来实现这个功能。运算符重载的基本用法:①使用成员函数重载运算符②使用非成员函数【友元函数】重载运算符 方式1:使用成员函数重载运算符Cow.h//需求:// 规则:// 一斤牛肉:2斤猪肉// 一斤羊肉:...
2020-04-15 18:28:38
177
原创 万物可运算——运算符重载(一)
友元友元的两种使用形式1.友元函数 2.友元类 友元函数:①使用全局函数作为友元函数Computer.h#pragma once#include <string>class Computer{public: Computer(); // 使用全局函数作为友元函数 friend void upgrade(Computer* comput...
2020-04-15 15:50:45
140
原创 上善若水——C++流
每次我们运行控制台用户数据都不能永久保存, 程序关闭后, 数据消失.那我们有没有什么办法把数据永久的保存到文件中呢? C++流C++的IO流(IO: 向设备输入数据和输出数据)设备:1)文件2)控制台3)特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 读写文件:文件流文件流: 对文件进行读写操作头文件: &...
2020-04-09 16:29:39
228
原创 王的遗产——继承和派生(二)
父与子亲密有间:子类对父类成员的访问权限无论通过什么方式(public、protected、private)继承: 在子类内部均可访问父类中的public、protected成员, private成员不可访问(如果想要子类能够访问,就定义为protected)继承方式只影响外界通过子类对父类成员的访问权限。 public继承,父类成员的访问权限全部保留至子类; ...
2020-04-08 21:34:47
192
原创 王的遗产——继承和派生(一)
什么是继承和派生父亲“派生”出儿子儿子“继承”自父亲派生和派生,本质是相同的,只是从不同的角度来描述。继承和派生在UML中的表示注意:“空心三角箭头”,从子类【派生的类】指向父类【被继承的类】父类,也称为“基类”除了“构造函数”和“析构函数”,父类的所有成员函数,以及数据成员,都会被子类继承!Father.h#pragma once#include <string...
2020-04-08 10:22:58
175
原创 斗转星移——面向对象(三)
析构函数作用:对象销毁前,做清理工作。具体的清理工作,一般和构造函数对应比如:如果在构造函数中,使用new分配了内存,就需在析构函数中用delete释放。如果构造函数中没有申请资源(主要是内存资源),那么很少使用析构函数。函数名:~类型没有返回值,没有参数,最多只能有一个析构函数访问权限:一般都使用public使用方法:不能主动调用。对象销毁时,自动调用。如果不定义,...
2020-04-07 22:52:35
354
原创 斗转星移——面向对象(二)
在这一章节开始前,我们先回顾一下上一节什么是对象?对象,是一个特定“类”的具体实例。对象和普通变量有什么区别?一个对象,就是一个特殊的变量,但是有着丰富的功能和用法。//借用我们上一节的类来举例//对象的第一种使用方法int main(void) { Human h1; // 通过自定义的特殊数据类型“Human”类, 来创建一个“对象” // 合法使用 h1.eat()...
2020-04-07 18:27:05
306
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人