设计模式
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
软件设计经验简谈
软件设计经验简谈原创 2023-01-07 16:57:24 · 739 阅读 · 0 评论 -
数据库切换设计
实现数据库的切换设计原创 2022-12-10 00:41:02 · 209 阅读 · 0 评论 -
换内存条引发的思考
在读大学的时候,由于没有经验买的笔记本内存是4G的,后来觉得内存太小了,就更换了一个大的。那为什么电脑的内存能随意更换呢?其实我们可以把电脑理解成一个大的软件系统,任何部件如CPU、内存、硬盘、显卡都可以理解为程序中的类。为什么不同品牌的CPU在电脑主板上插上就能用呢?这是因为CPU的对外都是针脚式或触点式的标准接口,这也就是软件设计中的依赖倒转原则。可以如下理解:1.高层模块不应该依赖底层模块,两个都应该依赖抽象2.抽象不应该依赖细节,细节应该依赖抽象。说的更加通俗易懂也就是,高层和底层谁也不依原创 2022-03-31 00:13:30 · 234 阅读 · 0 评论 -
设计模式-21-中介者模式
迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另外一个类的某一个方法的话,可以通过第三者转发这个调用。用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Mediator:中介者,它定义了一个接口用于与各个Colleague对象通信;ConcreteMediator:具体的中介者,它通过协调各Colleague对象实现协作行为;并了解和维护它的各个Colleague;C原创 2021-11-23 23:14:52 · 196 阅读 · 0 评论 -
设计模式-20-状态模式
State模式的构成:State类:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。ConcreteState类:具体状态,每一个子类实现一个与Context的一个状态相关的行为。Context类:维护一个ConcreteState子类的实例,这个实例定义当前的状态。下面是状态模式的示例:state.h#ifndef _STATE_H_#define _STATE_H_ class Context;class State{public: virtua.原创 2021-09-18 23:39:55 · 103 阅读 · 0 评论 -
设计模式之装饰器模式EX
#include<iostream>using namespace std;//抽象饮料类class Beverage{public: virtual int GetPrice() = 0;};//水果饮料类class FruitBeverage :public Beverage{public: int GetPrice() override { return 10; }};//抽象的装饰器类class Decorator :public Beverage原创 2021-08-28 23:45:07 · 93 阅读 · 0 评论 -
观察者模式Ex
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <ctime>#include<string>#include<list>#include <map>using namespace std;class Fighter;class Notifer{public: virtual void AddTolist(Fighter *player) = 0; vi原创 2021-08-28 16:58:03 · 94 阅读 · 0 评论 -
设计模式19-备忘录模式
1定义Memento pattern在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先的状态。2.类图3.代码结果:下面这篇写得很棒:https://blog.csdn.net/weixin_34268610/article/details/93397818?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineL原创 2021-08-22 22:22:57 · 81 阅读 · 0 评论 -
设计模式18-观察者模式
观察者模式是一个应用非常广的模式之一,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。下面是观察者的类图接下来看一个示例,代码如下:class observer{public: observer() = default; virtual ~observer(){}原创 2021-06-27 23:07:36 · 100 阅读 · 0 评论 -
设计模式17-策略模式
模式定义策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。Context(环境角色):持有一个队Strategy的引用,最终客户端调用Strategy(抽象策略):定义了一个公共接口,让不同的算法以不同的方式来实现,通过这个接口,Context可以调用不同的算法。ConcreteStrategy(具体策略):实现Strategy定义的接口,提供具体的算法实现。示例源码:#include<iostream>#include <原创 2021-05-30 13:38:19 · 121 阅读 · 0 评论 -
设计模式16-责任链模式
定义使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止类图代码示例class Handle_Car{public: virtual void makecar() = 0; void setNextHandle(Handle_Car *next) { nextHandel = next; }protected: Handle_Car *nextHandel;};class Han原创 2021-05-24 22:39:54 · 130 阅读 · 0 评论 -
设计模式15-模板模式
一、模板模式定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。二、模式结构角色AbstractClass(抽象类):定义或声明了一系列基本操作method,这些操作可以是具体也可以是抽象的,每一个操作都对应算法的一个步骤,在其派生类(子类)中可以重定义。抽象类中定义一个用于定义一个算法的流程框架的方法。ConcreteClass(派生类):抽象类的子原创 2021-05-22 18:37:02 · 84 阅读 · 0 评论 -
设计模式0-分类
原创 2021-05-22 17:24:24 · 88 阅读 · 0 评论 -
设计模式14-享元模式
一、共享模式介绍在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价-主要指内存需求方面的代价。享元模式尝试重用现有的同类对象,用唯一标识码(比如说id、hash等)判断,如果在内存中有,则返回这个唯一标识码所标识的对象,如果未找到匹配的对象,则创建新对象。下面是UML类图二、代码实现#include<iostream>#include<string>#include <map>using namespace原创 2021-05-22 17:14:40 · 146 阅读 · 0 评论 -
设计模式13-外观模式
一、什么是外观模式为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一个系统更加容易使用。说白了,其实就是对一系列接口的封装。二、Facade模式的构成: 外观角色(Facade):是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组合。子系统角色(Subsystemclasses):实现子系统的功能,并处理由Facade对象指派的任务。对子系统而言,facade和client角色是未知的,没有Fa原创 2021-05-22 11:40:58 · 113 阅读 · 0 评论 -
设计模式12-组合模式
一、什么是组合模式组合多个对象形成树形结构以表示“部分-整体”的结构层次。组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。可以简单理解为一组对象集合。其应用场景的特殊性,数据必须能表示成树形结构树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,这样的组织形式的特点在于:叶子节点不再包含成员对象,而容器节点可以包含成员对象,这些对象可以是叶子节点,也可以是容器节点。下面是UML类图二、模式结构Component(抽象构件):原创 2021-05-22 00:11:27 · 205 阅读 · 0 评论 -
设计模式11-装饰者模式
装饰者模式主要实现的功能是动态的给某一个类添加一些额外的功能,它是一个锦上添花者。想要扩展功能,装饰者提供了有别于继承的另外一种选择。设计模式的原则是多用组合少用继承。下面是一个关于扩展汽车的例子结果:...原创 2021-05-20 18:08:40 · 114 阅读 · 0 评论 -
设计模式之UML类图
虚线箭头指向依赖;实线箭头指向关联;虚线三角指向接口;实线三角指向父类;空心菱形能分离而独立存在,是聚合;实心菱形精密关联不可分,是组合;看https://www.cnblogs.com/pangjianxin/p/7877868.html...原创 2021-05-12 23:11:26 · 116 阅读 · 0 评论 -
设计模式之UML用例图
用例图主要用来描述“用户、需求、系统功能单元”之间的关系。它展示了一个外部用户能够观察到的系统功能模型图。【用途】:帮助开发团队以一种可视化的方式理解系统的功能需求。用例图所包含的元素如下: 1. 参与者(Actor)表示与您的应用程序或系统进行交互的用户、组织或外部系统。用一个小人表示。2. 用例(Use Case)用例就是外部可见的系统功能,对系统提供的服务进行描述。用椭圆表示。3. 子系统(Subsystem)用来展示系统的一部分功能,这部分功能联系紧密。 4. 关系用例转载 2021-05-11 13:24:15 · 529 阅读 · 0 评论 -
设计模式10-命令模式
命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。[GOF 《设计模式》]请看例子,Ty厨师、菜单、服务员:#include <iostream>using namespace std;#include <iostream>#include <vector>using nam...原创 2019-12-29 14:38:45 · 102 阅读 · 0 评论 -
设计模式09-模板模式
模板模式在GOF的《设计模式:可复用面向对象软件的基础》一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的接口即可重定义改算法的某些特定步骤。#include<iostream>using namespace std;class MakeCar{public: virtual voi...原创 2019-12-29 13:33:57 · 94 阅读 · 0 评论 -
设计模式08-桥接模式
桥接模式比如一个对象,如果A维度有3种变化,B维度有4种变化,C维度有2中变化。直接使用继承的方式,会有342种可能,即出现24个类,而且每个类都包含A B C维度,职责不单一,扩展性很差。使用桥接模式,通过组合的方式,那么只有3+4+2=9个类,同时每个类的职责都单一。扩展性也很强。代码如下:#include<iostream>#include<string>...原创 2019-12-29 13:22:23 · 144 阅读 · 0 评论 -
设计模式07-建造者模式
建造者模式这个直接用例子来理解,对于房子,有墙、门、窗,不同类型的房子墙、门、窗不同。在代码中我有相应的解释。#include<iostream>#include<string>using namespace std;//先抽象房子class House{private: string m_wall; string m_door; string m_w...原创 2019-12-29 11:41:16 · 122 阅读 · 0 评论 -
设计模式06-适配器模式
适配器模式比如我的手机需要充电要18v的电,但是目前只有220v的电,那么我就需要一个适配器,把220v的电搞成18v的电,代码如下:#include <iostream>using namespace std;class WantoUse18v{public: virtual void IwanToUse18v() = 0;};class Current220V{...原创 2019-12-29 11:13:33 · 91 阅读 · 0 评论 -
设计模式05-代理模式(委托模式)
代理模式(委托模式)就拿买书来说吧,先抽象一个买书接口,有实体店买书,而当当网可以操作实体店买书,但当当网自己可以做一些活动,比如打折,优惠券之类的。这个当当网就是一个中间层。#include<iostream>using namespace std;class sbject{public: virtual void sailbook() = 0;};class R...原创 2019-12-29 10:39:53 · 202 阅读 · 0 评论 -
设计模式04-抽象工厂模式
抽象工厂模式其实这部分内容没啥好讲的把代码看懂就行了,原理都不难,就比如本例子,一个工厂既可以生成鼠标和键盘,至于怎么生成就是工厂的事情了,比如联想工厂和戴尔工厂,对于用户来说,我想用哪个牌子的鼠标和键盘这是我自己可以选择的。#include<iostream>using namespace std;class keyboard{public: virtual void g...原创 2019-12-27 22:58:44 · 116 阅读 · 0 评论 -
设计模式03-简单工厂模式
简单工厂模式原理全在代码里,无需多解释,很简单#include <iostream>using namespace std;class Fruit{public: virtual void getFruit() = 0;};class banana :public Fruit{ virtual void getFruit() { printf("香蕉\n")...原创 2019-12-27 19:54:34 · 83 阅读 · 0 评论 -
设计模式02-工厂模式
工厂模式抽象水果,2.抽象工厂#include <iostream>using namespace std;class AbFruit{public: virtual void getFruit() = 0;};class banana :public AbFruit{ virtual void getFruit() { printf("香蕉\n");...原创 2019-12-27 19:41:14 · 135 阅读 · 0 评论 -
设计模式01-单例模式
单例模式下面是恶汉式(推介):class singlePerson{private: singlePerson() { }public: static singlePerson *getInstance() { return m_instance; } void myshow() { cout << "我是恶汉子,我饥不择食\n"...原创 2019-12-26 23:29:15 · 196 阅读 · 0 评论