设计Modern
这里的介绍一下设计模式的几种在(我的)工作种常用的模子,以及其代码和伪代码。此处主要作为一个知识积累库。如需详尽的表明还需百度。
观察者模式
用户往一个地方注册一个观察, 如果当观察者有探测到用户观察的消息,就推送给回给用户。观察者模式是一种行为设计模式, 允许你界说一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
- class Observer{public: Observer(){} virtual ~Observer(){} virtual void update(Subject *subject) = 0; virtual void update(string content) = 0;};class Subject{public: Subject() {} virtual ~ Subject() {} virtual string getContent() = 0; virtual string getAbstractContent() = 0; virtual void setContent(string content) = 0; // 订阅主题 void attach(Observer *observer) { observers.push_back(observer); } // 取消订阅 void detach(Observer *observer) { observers.remove(observer); } // 通知所有的订阅者 virtual void notifyObservers() { for(Observer *reader: observers) { // 拉模子 (也是有推送的性质,只是粒度小一些) reader->update(this); } } // 通知所有的订阅者 virtual void notifyObservers(string content) { for(Observer *reader: observers) { // 推模子 reader->update(content); } }private: list observers; // 生存注册的观察者};class Reader : public Observer{public: Reader() {} virtual ~Reader() {} virtual void update(Subject *subject) { // 调用对应的方法去拉取内容 subject->getContent() cout setJob("预警人员"); WatcherObserver *watcher3 = new Watcher(); watcher3->setJob("监测部分向导"); //注册观察者 subject->attach(watcher1); subject->attach(watcher2); subject->attach(watcher3); //填写水质陈诉 cout detach(watcher3); delete watcher1; delete watcher2; delete watcher3; delete subject; return 0;}
复制代码 抽象工厂模式
抽象工厂本质上是为差异组件或其相互依赖的对象提供创建接口,而无需指定详细的类。可以或许有效简直保这些相互依赖对象的一致性(客户根据实例化差异的工厂类,只能获取与该工厂中一系列相关的产物)。
工厂类一般为单实例,客户仅需初始化差异的工厂实例就可以得到差异的对象范例。
- class AbstractFactory{public: virtual Object_A* createA() =0 { return new Object_A; } virtual Object_N* createN() =0 { return new Object_N; }};class AbstractFactory_Huawei:public AbstractFactory{ virtual Object_A* createA(){return new Object_AA1;}; virtual Object_N* createN(){return new Object_NN1;};};class AbstractFactory_Xiaomi:public AbstractFactory{ virtual Object_A* createA(){return new Object_AA2;}; virtual Object_N* createN(){return new Object_NN2;};};
复制代码 工厂方法
这个方法本质上可以说就是创建一个对象的两个通用属性,然后详细然后需要其子类去现实它详细的功能。
比方我们经常使用的导出用户数据,我们有好多种方法导出,一种是导入到数据库,一种是导入到本地XML,一种是写入日志,导出数据就是一个通用属性,而差异的导出的方式就是其详细的功能。
- #include using namespace std;class ExportFileProduct{public: ExportFileProduct() {} virtual ~ExportFileProduct() {} virtual bool Export(string data) = 0;};// 生存成文件class ExportTextProduct: public ExportFileProduct{public: ExportTextProduct() {} virtual ~ExportTextProduct() { } virtual bool Export(string data) { cout ProducePartC(); }};/** * The client code creates a builder object, passes it to the director and then * initiates the construction process. The end result is retrieved from the * builder object. *//** * I used raw pointers for simplicity however you may prefer to use smart * pointers here */void ClientCode(Director& director){ ConcreteBuilder1* builder = new ConcreteBuilder1(); director.set_builder(builder); std::cout GetProduct(); p->ListParts(); delete p; std::cout GetProduct(); p->ListParts(); delete p; // Remember, the Builder pattern can be used without a Director class. std::cout ProducePartA(); builder->ProducePartC(); p=builder->GetProduct(); p->ListParts(); delete p; delete builder;}int main(){ Director* director= new Director(); ClientCode(*director); delete director; return 0; }
复制代码 单例
一次创建多次使用,这个比较简单就不上代码了。
原型模式
原型是一种创建型设计模式, 使你可以或许复制对象, 甚至是复杂对象, 而又无需使代码依赖它们所属的类。
所有的原型类都必须有一个通用的接口, 使得纵然在对象所属的详细类未知的情况下也能复制对象。 原型对象可以生成自身的完整副本, 因为相同类的对象可以相互访问对方的私有成员变量。
[code]using std::string;// Prototype Design Pattern//// Intent: Lets you copy existing objects without making your code dependent on// their classes.enum Type { PROTOTYPE_1 = 0, PROTOTYPE_2};/** * The example class that has cloning ability. We'll see how the values of field * with different types will be cloned. */class Prototype { protected: string prototype_name_; float prototype_field_; public: Prototype() {} Prototype(string prototype_name) : prototype_name_(prototype_name) { } virtual ~Prototype() {} virtual Prototype *Clone() const = 0; virtual void Method(float prototype_field) { this->prototype_field_ = prototype_field; std::cout |