
设计模式学习
学习为主,看情况转载或者写个人理解
正经的董同学
c++开发
展开
-
设计模式C++实现(18)——访问者模式
定义:访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。// VisitorModel.h文件#pragma once#include &.原创 2021-11-25 16:41:56 · 115 阅读 · 0 评论 -
设计模式C++实现(17)——策略模式
定义:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。柑橘跟简单工厂模式没区别,不多写了//抽象接口class ReplaceAlgorithm{public: virtual void Replace() = 0;};//三种具体的替换算法class LRU_ReplaceAlgorithm : public ReplaceAlgorithm{public: void Replace() {原创 2021-11-25 16:11:37 · 323 阅读 · 0 评论 -
设计模式C++实现(16)——观察者模式
定义:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。看定义一股熟悉感铺面而来,windows消息分发机制、udp广播等等,由此可见使用相当之广泛啊。很好理解的一种模式,看下代码例子验证一下。#include <原创 2021-11-25 15:05:50 · 191 阅读 · 0 评论 -
设计模式C++实现(15)——备忘录模式
定义:在不暴露对象实现细节的情况下保存和恢复对象之前的状态。#include <iostream>#include <string>using namespace std;//备忘录Mementoclass Memento{private: string account; string password; string telNo;public: Memento(string account,string password,string telNo原创 2021-11-25 14:18:40 · 404 阅读 · 0 评论 -
设计模式C++实现(14)——中介者模式
定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。看定义感觉跟桥接模式、代理模式很接近,个人感觉没必要分的如此细吧,中介者模式大概区别就是管理的是一系列的对象。三者感觉分别就是多对多,一对一、一对多,在我看来都一样,实现有那么亿点点区别。class Mediator;//抽象人class Person{protected: Mediator *m_mediator; //中介public: virtua原创 2021-11-25 12:19:40 · 140 阅读 · 0 评论 -
设计模式C++实现(13)——迭代器模式
前置知识:c++模板类,对此不熟悉甚至没听过的同学可以左转c++基础知识定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。前言:学习c++以来,STL的使用贯穿整个程序代码,其中与其密不可分的迭代器也用了很多次了,但往往没有深究它的作用,原理到底是什么,结合这个迭代器模式的学习算是有了一个不错的认知了。#include <iostream>#include <vector>using na原创 2021-11-25 11:36:13 · 255 阅读 · 0 评论 -
设计模式C++实现(12)——解释器模式
定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。看定义感觉就不像个程序模式,相关资料不多,靠谱的更少,csdn找到了个例子,还是错误的,我整理修改下作为参考,看代码还是很容易理解这模式是什么。#include <iostream>using namespace std;class Expression{public: Expression() {};public: virtual bool Interpret(s原创 2021-11-25 11:15:20 · 505 阅读 · 0 评论 -
设计模式C++实现(11)——命令模式
定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。理解和实现都挺简单的,命令多态化,多个执行接口的事情。/** * 命令模式,消除代码间的耦合 */#include <iostream>#include <vector>using namespace std;class Comman原创 2021-11-25 10:39:39 · 239 阅读 · 0 评论 -
设计模式C++实现(10)——职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。将对象连接成一条链,沿着链传递该请求,一开始我想的是局域网收发包的场景,看了下代码例子,还是很通俗易懂的//抽象管理者class Manager{protected: Manager *m_manager; string m_name;public: Manager(Manager *manager, string name):m_m原创 2021-11-25 10:23:37 · 132 阅读 · 0 评论 -
设计模式学习笔记(9)——代理模式
先看定义:给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式代理模式的应用场景很多,一开始想把集中场景都写一下,后来一看,有的确实不是简单几个代码片段就能讲清楚的,就直接上能体现其思想的例子吧。#include <iostream>#include <string>using namespace std;//Subjectclass Person{public: .原创 2021-11-25 10:05:20 · 235 阅读 · 0 评论 -
设计模式学习笔记(8)——享元模式
先看定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。初步理解为为减少创建对象开销,共享已存在对象,什么叫共享已存在的对象,这概念够抽象的,通过阅读csdn里面很多作者给的例子,嗯,说实话,大部分也挺裹得,这让我更糊涂了。嗯,功夫不负有心人,终于找到一个认为写的很清晰、贴切的例子了。直接上代码#include <iostream>#include <map>#i原创 2021-11-24 11:11:48 · 248 阅读 · 0 评论 -
设计模式学习笔记(7)——外观模式、组合模式
外观模式定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用云里雾里,看代码class Scanner{public: void Scan() { cout<<"词法分析"<<endl; }};class Parser{public: void Parse() { cout<<"语法分析"<<endl; }};class GenMidCode{public: void原创 2021-11-23 17:13:09 · 511 阅读 · 0 评论 -
设计模式学习笔记(6)——桥接模式
1. 作业桥梁模式完全是为了解决继承的缺点而设计的模式。继承的缺点是什么?即强侵入性,父类拥有的方法,子类必须照盘接收,如果只有这两层结构到没什么,假设是三层结构,子类下面还有子子类。突然有一天子类想重写父类的某个方法,但是子子类又想保持父类的方法实现,咋办?意图:将抽象部分和实现部分分离,使他们都可以独立的变化。继承恰恰就死抽象和实现耦合在一起的。关系够清楚了的吧。2. UML类图参与者:Abstraction:定义抽象类接口,同时维护一个指向Impementor类型的指针。Refin转载 2021-11-23 16:20:58 · 209 阅读 · 0 评论 -
设计模式学习笔记(5)——装饰者模式
先看定义:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作有点明白,看下代码确认下#include <iostream>#include <string>using namespace std;/*****原系统A:Target*****/class MangeSystemA{public: virtual void getName() { cout <&原创 2021-11-23 16:07:06 · 379 阅读 · 0 评论 -
设计模式学习笔记(4)——单例模式
先看定义,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。嗯,看定义就很清晰了。上代码//Singleton.hclass Singleton {public: static Singleton* GetInstance();private: Singleton() {} static Singleton *singleton;};//Singleton.cppSingleton* Singleton::singleton = NULL;Singlet原创 2021-11-23 15:50:55 · 222 阅读 · 0 评论 -
设计模式学习笔记(3)——原型模式、模板方法模式
先看定义原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。模板方法模式,在一个方法中定义一个算法的骨架,将一些步骤延伸子类中,子类在不改变算法结构的基础上,重新定义算法中的某些步骤。嗯,一如既往的看不懂定义,上代码。//父类class Resume{protected: char *name;public: Resume() {} virtual ~Resume() {} virtual Resume* Clone() { return NULL; }原创 2021-11-23 15:36:46 · 315 阅读 · 0 评论 -
设计模式学习笔记(2)——建造者模式
先看定义,建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,嗯,似懂非懂《大话设计模式》里的例子uml图,嗯看样子是Director类去控制虚类Builder上代码class Builder {public: virtual void BuildHead() {} virtual void BuildBody() {} virtual void BuildLeftArm(){} virtual void BuildRightArm().原创 2021-11-23 14:55:52 · 462 阅读 · 0 评论 -
设计模式学习笔记(1)——工厂模式
前置知识,设计模式的六大原则总原则:开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。1、单一职责原则不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。2、里氏替换原则(Lisko原创 2021-11-23 14:32:41 · 162 阅读 · 0 评论