大话设计模式C语言之备忘录模式
大话设计模式C语言之备忘录模式备忘录模式
备忘录模式 (MementoPattern) 备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
案例代码原发器
原发器(Originator)类可以生成自身状态的快照,也可以在需要时通过快照恢复自身状态。备忘录模式将创建状态快照(Snapshot)的工作委派给实际状态的拥有者原发器(Originator)对象。这样其他对象就不再需要从“外部”复制编辑器状态了,编辑器类拥有其状态的完全访问权,因此可以自行生成快照。
原发器接口 editor.h12345678910111213141516171819202122232425#ifndef EDITOR_H#define EDITOR_H#include "memento.h"typedef struct Editor Editor;/* 创建 / 销毁 */Editor *editor_create(void);vo ...
大话设计模式C语言之适配器模式
大话设计模式C语言之适配器模式适配器模式
适配器模式 (AdapterPattern) 适配器模式是一种结构型设计模式,可以将一个类的接口转换成客户希望的另外一个接口,它能使接口不兼容的对象能够相互合作。
案例代码客户端接口 logger.h
客户端接口(Client Interface)描述了其他类与客户端代码合作时必须遵循的协议。
123456789101112131415161718#ifndef LOGGER_H#define LOGGER_Htypedef struct Logger Logger;/* 统一接口 */void logger_write(Logger *logger, const char *message);/* 统一销毁 */void logger_destroy(Logger *logger);/* 工厂方法 */Logger *console_logger_create(void);Logger *legacy_logger_adapter_create(void);#endif
某个新服务具体实现 console_logger.c1234567 ...
大话设计模式C语言之状态模式
大话设计模式C语言之状态模式状态模式
状态模式 (StatePattern) 状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。
案例代码上下文接口 connection.h
上下文(Context)保存了对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
123456789101112131415#ifndef CONNECTION_H#define CONNECTION_Htypedef struct Connection Connection;/* Context API */Connection *connection_create(void);void connection_destroy(Connection *conn);int connection_connect(Connection *conn);int connection_disconnect(Connection *conn);int connection_s ...
大话设计模式C语言之抽象工厂
大话设计模式C语言之抽象工厂抽象工厂模式
抽象工厂 (AbstractFactory) 模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
案例代码抽象产品接口
抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。
抽象button接口 button.h12345678910#ifndef BUTTON_H#define BUTTON_Htypedef struct Button Button;void button_draw(Button *self);void button_destroy(Button *self);#endif
抽象checkbox接口 checkbox.h12345678910#ifndef CHECKBOX_H#define CHECKBOX_Htypedef struct Checkbox Checkbox;void checkbox_draw(Checkbox *self);void checkbox_destroy(Checkbox *self);#endif
具体产品
具体产品 ...
大话设计模式C语言之观察者模式
大话设计模式C语言之观察者模式观察者模式
观察者模式 (ObserverPattern) 是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。
观察者模式就像是MQTT的Pub/Sub机制,两者道相同,但观察者模式属于一种软件设计模式最重要针对代码层次,而发布订阅机制是一种系统架构模式,针对的是系统架构层次。但本质思想是相同的。
案例代码观察者接口 observer.h
接口声明了通知接口。在绝大多数情况下,该接口仅包含一个update更新方法。该方法可以拥有多个参数,使发布者能在更新时传递事件的详细信息。
1234567891011121314151617#ifndef OBSERVER_H#define OBSERVER_Htypedef struct Observer Observer;/* 观察者回调接口 */typedef void (*ObserverUpdateFn)(Observer *self, const void *event);/* 创建 / 销毁 */Observer *o ...
大话设计模式C语言之建造模式
大话设计模式C语言之建造模式建造模式
建造模式 (BuilderPattern) 是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。
下面举了一个Director + Builder模式构造不同的 ServerConfig 配置实例,使用director的三个预设方法(build_http / build_https / build_high_perf)并传入同一个builder和不同的host字符串来构建三种配置,然后把各实例的字段打印出来并销毁的例子。
案例代码产品接口 server_config.h
产品 (Products) 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
123456789101112131415161718#ifndef SERVER_CONFIG_H#define SERVER_CONFIG_Htypedef struct ServerConfig ServerConfig;/* 只读访问接口 */const char *se ...
大话设计模式C语言之外观模式
大话设计模式C语言之外观模式外观模式
外观 (Facade) 提供了一种访问特定子系统功能的便捷方式,其了解如何重定向客户端请求,知晓如何操作一切活动部件。
案例代码外观接口 facade.h
抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
外观模式提供一个统一的高层接口使子系统更容易使用降低依赖复杂性。通过initialize_system、shutdown_system 和 read_data 这几个函数,客户端可以控制系统的行为,而不需要关心具体的子系统实现。每个函数的实现实际上都在内部调用了多个低级别的操作(例如硬件初始化、传感器校准等)。
123456789101112131415#ifndef FACADE_H#define FACADE_Htypedef struct Facade Facade;// 公共接口Facade *create_facade();void destroy_facade(Facade *facade);void in ...
大话设计模式C语言之模板模式
大话设计模式C语言之模板模式模板模式
模板方法 (Template Method) 模式:在基类中定义算法骨架,将某些步骤延迟到子类实现,使子类在不改变算法结构的情况下重新定义算法的某些步骤。
案例代码 这里举了数据处理模板的例子,在基类中定义了数据处理模板,将数据处理的具体步骤延迟到文件数据处理与网络数据处理两个子类实现,使子类在不改变数据处理模板的情况下重新定义数据处理的具体步骤。
案例代码抽象基类 data_processor.h
抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
模型模式通过结构体内的函数指针定义了类中必须实现和可选实现的抽象方法步骤,以及声明了通用的算法模板。
12345678910111213141516171819202122232425262728#ifndef DATA_PROCESSOR_H#define DATA_PROCESSOR_Htypedef struct DataProcessor Dat ...
关于工厂方法的补充
产品接口 logger.h 在产品接口中将方法封装到模块中,外面看不到Logger的具体细节。
1234567891011#ifndef LOGGER_H#define LOGGER_Htypedef struct Logger Logger;void logger_log(Logger *logger, const char *message);void logger_destroy(Logger *logger);#endif //LOGGER_H
产品中间层 logger_internal.h 内部对象模型,Logger的真实定义在这里,这个文件不对外提供。
123456789101112131415161718#ifndef LOGGER_INTERNAL_H#define LOGGER_INTERNAL_H#include "logger.h"/* 内部虚函数表 */typedef struct LoggerVTable { void (*log)(Logger *, const char *) ...
大话设计模式C语言之原型模式
大话设计模式C语言之原型模式原型模式
原型(Prototype)模式是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。
案例代码 这里会举了两个简单例子来帮助理解原型模式,第一个例子帮助我们理解原型模式的基本结构,具体原型如何深拷贝实现clone接口来实现原型模式的,以及在符合开闭原则下通过函数指针的多态性对新原型的拓展。第二个例子主要是带我们了解原型注册表这一概念,注册表提供了一种访问常用原型的简单方法,其中存储了一系列可供随时复制的预生成对象,我们可以提供过注册表集中管理对象模板,这样我们就可以根据字符串、配置、网络消息等方式动态创建对象。
案例代码一原型接口 prototype.h
原型 (Prototype)接口将对克隆方法进行声明。在绝大多数情况下,其中只会有一个名为 clone克隆的方法。
原型模式需要注意的是在实现克隆接口的时候要注意浅拷贝问题,这里使用结构体指针作为参数,返回值也是结构体指针,这样就可以实现深拷贝。
12345678910111213#ifndef PROTOTYPE_H#def ...















