大话设计模式C语言之访问者模式
大话设计模式C语言之访问者模式访问者模式
访问者模式(Visitor Pattern)是一种行为设计模式,它能将算法与其所作用的对象隔离开来,一个作用于某对象结构中的各元素的操作,他使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
案例代码下面例子实现对设备系统中的不同硬件组件支持不同访问操作:诊断访问者(DiagnosticVisitor)、功耗统计访问者(PowerVisitor)、温度统计访问者(TemperatureVisitor)等等。
访问者
访问者(Visitor)接口声明了一系列以对象结构的具体元素为参数的访问者方法。如果编程语言支持重载,这些方法的名称可以是相同的,但是其参数一定是不同的。
访问者外部抽象接口 visitor.h12345678910111213141516#ifndef VISITOR_H#define VISITOR_Htypedef struct Visitor Visitor;typedef struct CPU CPU;typedef struct Memory Memory;typedef struct Device De ...
大话设计模式C语言之解释器模式
大话设计模式C语言之解释器模式解释器模式
解释器模式(Interpreter Pattern)解释器模式是一种行为型设计模式,它定义了一种语言文法的表示,并且定义了一个解释器,用于解释该语言中的句子。
案例代码下面例子实现检测 (temp > 60 AND pressure < 50) OR motor_on == 0 表达式。
抽象表达式(Abstract Expression)
定义解释器的接口interpret(context)方法,供子类实现具体解析逻辑,所有的表达式都必须实现该接口。
expr.h123456789101112#ifndef EXPR_H#define EXPR_Htypedef struct Expression Expression;typedef struct Context Context;int expr_evaluate(Expression *expr, Context *ctx);void expr_destroy(Expression *expr);#endif
expr_internal.h1234567891011121 ...
大话设计模式C语言之享元模式
大话设计模式C语言之享元模式享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。
案例代码本案例中每个字符 glyph 是享元对象(Flyweight),字符的字体、大小、粗细 是内部状态(intrinsic state)字符的位置 是外部状态(extrinsic state),享元由 FlyweightFactory 管理并复用。使用 opaque pointer 完全隐藏 struct。
享元
享元(Flyweight)类包含原始对象中部分能在多个对象中共享的状态。同一享元对象可在许多不同情景中使用。享元中存储的状态被称为 “内在状态”。传递给享元方法的状态被称为 “外在状态”。
享元接口 flyweight.h123456789101112131415161718#ifndef FLYWEIGHT_FACTORY_H#define FLYWEIGHT_FACTORY_H#include "flyweight.h"type ...
大话设计模式C语言之中介者模式
大话设计模式C语言之中介者模式中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作,从而降低它们间的耦合。
案例代码中介者中介者接口 mediator.h
中介者(Mediator)接口声明了与组件交流的方法,但通常仅包括一个通知方法。组件可将任意上下文(包括自己的对象)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。
1234567891011121314151617181920#ifndef MEDIATOR_H#define MEDIATOR_Htypedef struct HomeMediator HomeMediator;typedef struct Light Light;typedef struct Fan Fan;typedef struct Sensor Sensor;HomeMediator *home_mediator_create(void);void home_mediator_destroy(HomeMediato ...
大话设计模式C语言之责任链模式
大话设计模式C语言之责任链模式责任链模式
责任链模式(Chain of Responsibility)是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
案例代码抽象请求处理者
处理者(Handler)声明了所有具体处理者的通用接口。该接口通常仅包含单个方法用于请求处理,但有时其还会包含一个设置链上下个处理者的方法。
抽象处理者外部接口 handler.h12345678910111213141516171819#ifndef HANDLER_H#define HANDLER_Htypedef struct Handler Handler;/* 错误码定义 */typedef enum { HANDLER_OK = 0, HANDLER_STOP = 1, HANDLER_ERROR = -1} HandlerStatus;/* 对外接口 */HandlerStatus handler_handle(Handler *handler, void *request);voi ...
大话设计模式C语言之命令模式
大话设计模式C语言之命令模式命令模式
命令模式(Command Pattern)是一种行为设计模式它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。
案例代码发送者/触发者
发送者(Sender)或称 “触发者(Invoker)” 类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。发送者触发命令,而不向接收者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令,这里使用命令队列实现。
命令队列接口 command_queue.h123456789101112131415#ifndef COMMAND_QUEUE_H#define COMMAND_QUEUE_H#include "command.h"typedef struct CommandQueue CommandQueue;CommandQueue *command_queue_create(int capacity);int comm ...
大话设计模式C语言之桥接模式
大话设计模式C语言之桥接模式桥接模式
桥接模式(Bridge Pattern)是结构型设计模式,主要通过将抽象部分与实现部分分离,使得二者可以独立变化分别使用。
案例代码抽象部分
抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底层实际工作的实现对象。
显示接口 display.h123456789101112131415#ifndef DISPLAY_H#define DISPLAY_H#include "display_driver.h"typedef struct Display Display;Display* display_create(DisplayDriverType type);void display_destroy(Display *display);/* 桥接接口 */void display_draw_circle(Display *display, int x,int y,int r);#endif
显示实现 display.c1234567891011121314151617181920212223242526272 ...
大话设计模式C语言之单例模式
大话设计模式C语言之单例模式单例模式
单例模式 (SingletonPattern) 是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。
案例代码对象单例单例日志类接口 logger.h
单例(Singleton)类声明了一个名为 getInstance获取实例的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端(Client)代码隐藏。调用获取实例方法必须是获取单例对象的唯一方式。
123456789101112131415#ifndef LOGGER_H#define LOGGER_Htypedef struct Logger Logger;/* 显式初始化(嵌入式推荐) */void logger_init(void);/* 获取单例 */Logger *logger_instance(void);/* 输出日志 */void logger_log(Logger *self, const char *msg);#endif
单例日志类实现 logger.c1234567891011121314151617181920212 ...
大话设计模式C语言之迭代器模式
大话设计模式C语言之迭代器模式迭代器模式
迭代器模式 (IteratorPattern) 是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。
案例代码迭代器迭代器对外接口 iterator.h
迭代器(Iterator)接口声明了遍历集合所需的操作:获取下一个元素、获取当前位置和重新开始迭代等。
12345678910111213#ifndef ITERATOR_H#define ITERATOR_Htypedef struct Iterator Iterator;int iterator_first(Iterator *it);int iterator_next(Iterator *it);int iterator_is_done(Iterator *it);int iterator_current(Iterator *it);void iterator_destroy(Iterator *it);#endif
迭代器内部抽象接口 iterator_internal.h12345678910111213141516#ifn ...
大话设计模式C语言之组合模式
大话设计模式C语言之组合模式组合模式
组合模式 (CompositePattern) 是一种结构型设计模式,将对象组合成树状结构以表示“整体/部分”层次关系,使得用户对单个对象和组合对象的使用具有一致性,组合模式以递归方式处理对象树中的所有项目。
案例代码组件部分
组件 (Component)接口描述了树中简单项目和复杂项目所共有的操作,实现所有类共有接口的默认行为。在递归组合树时,组件接口使得我们可以在树中忽略单个对象和组合对象之间的区别。
组件接口 component.h123456789101112131415161718192021222324252627282930#ifndef COMPONENT_H#define COMPONENT_H#include <stddef.h>typedef struct Component Component;/* 虚函数表 */typedef struct ComponentVTable { void (*destroy)(Component *self); void (*print ...










