C++设计模式4.中介者

中介者(Mediator) 中介者模式属于设计模式::行为模式的一种,特别的,属于行为对象模式。 行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述他们之间的通信模式(协作)。 行为模式分为两种: 行为类模式:使用继承机制在类间分配行为。 行为对象模式:使用对象复合而不是继承。 一言以蔽之 引入一个中间对象(中介),解决对象间的(双向)依赖,避免紧耦合(接口隔离)。 注:门面模式(Facade)解决系统间单向的依赖。 举例 /* * 窗口对话框的基类 */ class Director{ public: virtual ~Director(); virtual void WidgetChanged(Widget*) = 0; protected: Director(); virtual void CreateWidgets() = 0; } /* * 控件的基类 */ class Widget{ public: Widget(Director*); virtual void Changed(){ // 在这里调用Director的接口方法,Director的子类为窗口 _director->WidgetChanged(); } // 规范接口 virtual void HandleMouseEvent(MouseEvent& event); private: Director* _director; } class ListBox : public Widget{ public: ListBox(Director*); virtual const char* GetSelection(); virtual void SetList(List<char*>* listItems); virtual void HandleMouseEvent(MouseEvent& event) override{} } class EntryField : public Widget{ public: EntryField(Director*); virtual const char* GetText(); virtual void SetText(const char* text); virtual void HandleMouseEvent(MouseEvent& event) override {} } class Button : public Widget{ public: Button(Director*); virtual void SetText(const char* text); virtual void HandleMouseEvent(MouseEvent& event) override { // ....

August 9, 2022 · 2 min · 218 words · Me

C++设计模式3.观察者

观察者(Observer) 观察者模式属于设计模式::行为模式的一种,特别的,属于行为对象模式。 行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述他们之间的通信模式(协作)。 行为模式分为两种: 行为类模式:使用继承机制在类间分配行为。 行为对象模式:使用对象复合而不是继承。 一言以蔽之 一对多的依赖关系,一个改变,所有依赖他的对象(即观察者)都得到更新。 目的:通知(抽象的通知机制) 举例:更新进度条,需要将进度值传出;MVC架构:Model改变,所有的View都会得到通知。 举例1-进度条 伪代码: class IProgress{ public: virtual void DoProgress(float value) = 0; virtual ~IProgress(){} }; // 可以记录观察者、移除观察者、通知观察者(也有订阅的意味) class FileSplitter { string m_filePath; int m_fileNumber; List<IProgress*> m_iprogressList; // 抽象通知机制,支持记录多个观察者 public: FileSplitter(const string& filePath, int fileNumber) : m_filePath(filePath), m_fileNumber(fileNumber){ } void split(){ //1.读取大文件 //2.分批次向小文件中写入 for (int i = 0; i < m_fileNumber; i++){ //... float progressValue = m_fileNumber; progressValue = (i + 1) / progressValue; onProgress(progressValue);//发送通知 } } void addIProgress(IProgress* iprogress){ m_iprogressList....

August 8, 2022 · 2 min · 238 words · Me

C++设计模式2.解释器

解释器(Interpreter) 解释器模式属于设计模式::行为模式的一种,特别的,属于行为类模式。 行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述他们之间的通信模式(协作)。 行为模式分为两种: 行为类模式:使用继承机制在类间分配行为。 行为对象模式:使用对象复合而不是继承。 一言以蔽之 为了对某种规范进行解析,子类(抽象语法树上的节点)实现父类的虚接口,把某种规范变成抽象语法树(调用堆栈),使用循环或递归调用接口。注意:子类可以调用不同类型的子类以建立抽象语法树。 举例 #include <iostream> #include <map> #include <stack> class Expression { public: virtual int interpreter(std::map<char, int>) = 0; virtual ~Expression() = default; }; // 下面这一行的在Clion下编译不过去,结果发现Clion的编码是没有Bom的UTF-8...解决办法:....太长了,放下面 // 变量表达式 class VarExpression : public Expression { char m_key; public: explicit VarExpression(const char& key) : m_key(key) {} int interpreter(std::map<char, int> var) override { return var[m_key]; } }; // 符号表达式 class SymbolExpression : public Expression { protected: // 左右两个运算符 Expression* m_left; Expression* m_right; public: SymbolExpression(Expression* left, Expression* right) : m_left(left), m_right(right) {} }; // 加法 class AddExpression : public SymbolExpression { public: explicit AddExpression(Expression* left, Expression* right) : SymbolExpression(left, right) {} int interpreter(std::map<char, int> var) override { return m_left->interpreter(var) + m_right->interpreter(var); } }; // 减法 class SubExpression : public SymbolExpression { public: explicit SubExpression(Expression* left, Expression* right) : SymbolExpression(left, right) {} int interpreter(std::map<char, int> var) override { return m_left->interpreter(var) - m_right->interpreter(var); } }; Expression* analyse(const std::string& expStr) { std::stack<Expression*> expStack; Expression* left{ nullptr }; Expression* right{ nullptr }; for (int i = 0; i < expStr....

July 27, 2022 · 2 min · 294 words · Me

C++设计模式1.模板方法

模板方法(Template Method) 模板方法属于 设计模式::行为模式 的一种,特别的,属于 行为类模式。 行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述他们之间的通信模式(协作)。 行为模式分为两种: 行为类模式:使用继承机制在类间分配行为。 行为对象模式:使用对象复合而不是继承。 一言以蔽之 类库中使用虚函数留下接口,子类继承时重写虚接口,实现晚绑定。 建议: 类库中的虚函数应使用纯虚函数,且放在 protected 区 命名:纯虚函数使用 Do- 前缀 举例 class Library { public: // Run是一个稳定的接口 Run() { // First Step if (Open()) Read(); // Second Step DoModify(); // Finale Close(); } int Open(); int Read(); int Close(); protected: virtual void DoModify() = 0; // 自定义行为 } class Application : public Library { public: // 修改父类行为,实现晚绑定 void DoModify() override { // ....

July 26, 2022 · 1 min · 94 words · Me

C++设计模式0.总述

目的:复用性和灵活性好 8大设计原则: 依赖倒置原则: 编译时依赖 设计模式依据目的可以分为三类: 创建型(Creational); 结构型(Structural); 行为型(Behavioral); 设计模式按照范围分为两类: 类模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编辑时刻便确定下来了。 对象模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具有动态性。 创建型类模式:将对象的部分创建工作延迟到子类; 创建型对象模式:将对象的部分创建工作延迟到另一个对象中; 结构型类模式:使用继承机制组合类; 结构型对象模式:描述了对象的组装方式; 行为型类模式:使用继承描述算法和控制流; 行为型对象模式:描述一组对象怎样协作完成单个对象无法完成的任务; 创建型: Factory Method(类模式) 定义了一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method模式使得一个类的实例化延迟到其子类。 Abstract Factory 提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。 Builder 将一个复杂对象结构与它的表示分离,使得同样的构建过程可以创建不同的表示。 Prototype 用原型实例制定创建对象的种类,并且通过拷贝这个原型来创建的对象。 Singleton 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。 结构型: Adapter(类模式) 通过类继承,将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Adapter 通过对象组合,将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Bridge 将抽象部分与它的显示部分分离,使它们都可以独立地变化。 Composite 将对象组合成树形结构以表示“部分-整体”的层次结构。使得客户对单个对象和复合对象的使用具有一致性。 Decorator 动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。 Facade 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。 Flyweight 运用共享技术有效地支持大量细粒度的对象。 Proxy 为其他对象提供一个代理以控制对这个对象的访问。 行为型: Interpreter(类模式) 给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的语句。 Template Method(类模式) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。 Chain Of Responsibility 为清除请求的发送者和接受者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 Command 将一个请求封装为一个对象,从而使得可以用不同请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。 Iterator 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 Mediator 用一个中介对象来封装一系列的对象交互,中介者使得各对象不需要显式地相互引用,从而使得耦合度降低,而且可以独立地改变它们之间的交互。 Memento 在不破坏封装性的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到保存状态。 Observer 定义对象的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象多得到通知并自动刷新。 State 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。...

July 17, 2022 · 1 min · 74 words · Me