请选择 进入手机版 | 继续访问电脑版

设计模式解释与例子(C++)

[复制链接]
云韵 发表于 2021-1-1 18:30:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
设计Modern

这里的介绍一下设计模式的几种在(我的)工作种常用的模子,以及其代码和伪代码。此处主要作为一个知识积累库。如需详尽的表明还需百度。
观察者模式

用户往一个地方注册一个观察, 如果当观察者有探测到用户观察的消息,就推送给回给用户。观察者模式是一种行为设计模式, 允许你界说一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
  1. 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;}
复制代码
抽象工厂模式

抽象工厂本质上是为差异组件或其相互依赖的对象提供创建接口,而无需指定详细的类。可以或许有效简直保这些相互依赖对象的一致性(客户根据实例化差异的工厂类,只能获取与该工厂中一系列相关的产物)。
工厂类一般为单实例,客户仅需初始化差异的工厂实例就可以得到差异的对象范例。
  1. 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,一种是写入日志,导出数据就是一个通用属性,而差异的导出的方式就是其详细的功能。
  1. #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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )