C++中的面向对象设计模式实践

这篇具有很好参考价值的文章主要介绍了C++中的面向对象设计模式实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面向对象程序设计(Object-Oriented Programming,简称OOP)是一种将程序设计问题分解为对象的思维方式。它通过定义对象和对象之间的关系,将问题模型化并转化为代码实现。在面向对象设计模式中,设计模式是一种被普遍接受的解决问题的方法论。

C++作为一种多范式编程语言,提供了强大的面向对象编程能力。它支持封装、继承和多态等重要的面向对象特性,使得我们可以使用各种设计模式来解决各种现实世界的编程问题。

下面将介绍几种常用的面向对象设计模式,以帮助读者更好地理解和应用C++中的面向对象设计模式。

  1. 单例模式(Singleton Pattern):
    单例模式保证一个类中只有一个实例,并提供了一个全局访问该实例的入口。在C++中,可以通过将构造函数设为私有,通过一个静态方法返回唯一实例来实现单例模式。
    例如:

    class Singleton {
    public:
        static Singleton& getInstance() {
            static Singleton instance;
            return instance;
        }
    private:
        Singleton() {}
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    };
    
  2. 工厂模式(Factory Pattern):
    工厂模式用于创建对象,并将对象的创建与使用解耦。通过定义一个工厂类来创建对象,客户端只需要通过工厂类来获取所需的对象,而不需要关心对象的具体创建过程。
    例如:

    class Product {
    public:
        virtual void use() = 0;
    };
    
    class ConcreteProduct : public Product {
    public:
        void use() override {
            // 具体的产品实现
        }
    };
    
    class Factory {
    public:
        static Product* createProduct() {
            return new ConcreteProduct();
        }
    };
    
  3. 观察者模式(Observer Pattern):
    观察者模式定义了一种一对多的依赖关系,当一个对象的状态改变时,所有依赖它的对象都会收到通知并自动更新。在C++中常常使用回调函数或者使用信号槽机制来实现观察者模式。
    例如:

    class Observer {
    public:
        virtual void update() = 0;
    };
    
    class Subject {
    public:
        void attach(Observer* observer) {
            observers.push_back(observer);
        }
    
        void notify() {
            for (auto observer : observers) {
                observer->update();
            }
        }
    private:
        std::vector<Observer*> observers;
    };
    
  4. 策略模式(Strategy Pattern):
    策略模式定义了一系列的算法,并将这些算法封装为一系列的策略类。在运行时,可以根据需要动态地选择其中一个策略类以完成特定的任务。策略模式可以让算法的变化独立于使用算法的客户端。
    例如:

    class Strategy {
    public:
        virtual void operate() = 0;
    };
    
    class ConcreteStrategyA : public Strategy {
    public:
        void operate() override {
            // 算法A的具体实现
        }
    };
    
    class ConcreteStrategyB : public Strategy {
    public:
        void operate() override {
            // 算法B的具体实现
        }
    };
    
    class Context {
    public:
        void setStrategy(Strategy* strategy) {
            this->strategy = strategy;
        }
    
        void executeStrategy() {
            strategy->operate();
        }
    private:
        Strategy* strategy;
    };
    

以上只是介绍了几种常见的面向对象设计模式。在实际的软件开发中,根据具体的需求和问题,可能会使用到更多其他的设计模式。理解和设计模式的原理和应用场景对于高效的面向对象编程至关重要。继续介绍几种常用的面向对象设计模式:

5.适配器模式(Adapter Pattern):
适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。通过适配器类,可以让原本不兼容的类能够协同工作。
例如:

class Target {
public:
    virtual void request() = 0;
};

class Adaptee {
public:
    void specificRequest() {
        // 原本不兼容的类的特殊接口
    }
};

class Adapter : public Target {
public:
    void request() override {
        // 在适配器中调用特殊接口
        adaptee.specificRequest();
    }
private:
    Adaptee adaptee;
};
  1. 模板方法模式(Template Method Pattern):
    模板方法模式定义了一个算法的骨架,将一些步骤的具体实现延迟到子类。在模板方法中,通过定义抽象类并在其中定义一系列的抽象操作,以控制子类的行为。
    例如:

    class AbstractClass {
    public:
        void templateMethod() {
            // ...
            primitiveOperation1();
            // ...
            primitiveOperation2();
            // ...
        }
    protected:
        virtual void primitiveOperation1() = 0;
        virtual void primitiveOperation2() = 0;
    };
    
    class ConcreteClass : public AbstractClass {
    protected:
        void primitiveOperation1() override {
            // 具体实现1
        }
    
        void primitiveOperation2() override {
            // 具体实现2
        }
    };
    
  2. 建造者模式(Builder Pattern):
    建造者模式用于将一个复杂对象的构建过程和其表示分离,使得同样的构建过程可以创建不同的表示。通过定义一个建造者类和一个指挥者类,可以一步一步地构建一个复杂对象。
    例如:

    class Product {
    public:
        void setPartA(const std::string& partA) {
            this->partA = partA;
        }
    
        void setPartB(const std::string& partB) {
            this->partB = partB;
        }
    
        void setPartC(const std::string& partC) {
            this->partC = partC;
        }
    private:
        std::string partA;
        std::string partB;
        std::string partC;
    };
    
    class Builder {
    public:
        virtual void buildPartA() = 0;
        virtual void buildPartB() = 0;
        virtual void buildPartC() = 0;
        virtual Product* getResult() = 0;
    };
    
    class ConcreteBuilder : public Builder {
    public:
        void buildPartA() override {
            product->setPartA("PartA");
        }
    
        void buildPartB() override {
            product->setPartB("PartB");
        }
    
        void buildPartC() override {
            product->setPartC("PartC");
        }
    
        Product* getResult() override {
            return product;
        }
    private:
        Product* product = new Product();
    };
    
    class Director {
    public:
        void setBuilder(Builder* builder) {
            this->builder = builder;
        }
    
        Product* construct() {
            builder->buildPartA();
            builder->buildPartB();
            builder->buildPartC();
            return builder->getResult();
        }
    private:
        Builder* builder;
    };
    

这些是一些常见的面向对象设计模式,它们都有各自的原理和适用场景。在实际的软件开发中,根据具体的需求和问题,也可以混合使用多种设计模式来得到更好的解决方案。设计模式的应用可以提高代码的重用性、扩展性和可维护性,让我们的程序更加灵活和可靠。文章来源地址https://www.toymoban.com/news/detail-798861.html

到了这里,关于C++中的面向对象设计模式实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《设计模式的艺术》笔记 - 面向对象设计原则

    1、单一职责原则         一个类只负责单一功能领域中的相应职责。 2、开闭原则         一个软件实体应当对扩展开放,对修改关闭。即软件实体应当尽量在不修改原有代码的情况下进行扩展。 3、里氏代换原则         所有引用基类的地方必须能透明地使用其子类的对

    2024年01月21日
    浏览(60)
  • javascript设计模式-面向对象基础

    在JS这种弱类型的语言中,类型不匹配错误很难跟踪。可以使用接口来进行类型检查。如果强制使用,又会弱化语言的灵活性。因为有额外的代码调用,所以又会降低性能。解决方法就是在开发时进行类型检查,在开始完成后删除此部分代码。 但JS中的接口实现方式是模拟的

    2024年01月18日
    浏览(37)
  • 设计模式学习笔记 - 面向对象 - 1.面向对象到底讨论的是什么

    面向对象编程( OOP )的全称是 Object Oriented Programming 。 面向对象编程语言( OOPL )的全称是 Object Oriented Programming Language 。 面向对象编程中有两个非常重要的概念,就是类( Class )和对象( Object )。面向对象编程这个概念第一次使用是在 SmallTalk 这种编程语言中,它也被认

    2024年02月22日
    浏览(46)
  • 设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?

    在过往的工作中,我发现很多人搞不清面向对象和面向过程的区别,总认为使用面向对象编程语言来开发,就是在面向面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀

    2024年02月22日
    浏览(49)
  • 设计模式 -- 策略模式(传统面向对象与JavaScript 的对比实现)

    规则:根据员工的工资基数和年底绩效情况计算年终奖 初级实现 缺点 多重 if else 违反开发-封闭原则,可维护性差 复用性差 使用组合函数重构代码 使用组合函数来重构代码,把各种算法封装到一个个的小函数里面,这些小函数有着良好的命名,可以一目了然地知道它对应着

    2024年02月11日
    浏览(67)
  • 2.python设计模式【面向对象设计的SOLID原则 基础概念】

    概念:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应该尽量在不修改原有代码的情况下进行扩展 概念:所有引用父类的地方必须能透明地使用其子类的对象 概念:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不依赖细节;细节

    2024年02月16日
    浏览(51)
  • 一网打尽java注解-克隆-面向对象设计原则-设计模式

    注解 :也叫标注,用于包、类、变量、方法、参数上。可以通过反射获取标注。可以在编译期间使用,也可以被编译到字节码文件中,运行时生效。 内置注解 :Java语言已经定义好的注解。 @Overread :用于方法重写。 @Deprecated :标记过时方法。 @SuppressWarnings :指示编译器去

    2024年02月11日
    浏览(46)
  • 基于C语言的面向对象设计模式(持续更新)

    首先这篇文章只是初步的尝试,不涉及过于高深的编程技巧;同时需要表明的是, 面向对象只是一种思想 ,不局限于什么样的编程语言,不可否认的是基于面向对象特性而设计的语言确实要比面向过程式的语言更加容易进行抽象和统筹,可以说面向对象的设计模式可以很大

    2024年04月10日
    浏览(47)
  • 【WinForm】C#实现商场收银软件,从面向过程到面向对象,设计模式的应用

    实现商场收银系统从简单的面向过程到面向对象的演变。 最容易想到的: 单价*数量=总价 根据输入的单价和数量,直接计算,将结果显示在listbox控件中。 重置按钮可以清零。 1、运行效果 2、界面设计 3、代码 版本2在版本1的基础上增加了打折优惠。 1、运行效果 打折下拉框

    2024年02月09日
    浏览(45)
  • 设计模式学习笔记 - 面向对象 - 2.封装、抽象、继承、多态分别用来解决哪些问题?

    封装 也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方法(或者叫作函数)来访问内部信息或数据。 下面这段代码是一个简化版的虚拟钱包的代码实现。在金融系统中,我们会给每个用户创建一个虚拟钱包,用来记录用户在我们

    2024年02月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包