当前位置: 首页 > news >正文

菜馆网站制作市场推广策略

菜馆网站制作,市场推广策略,手机网站开发视频,专做热血电影的网站【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置? 依赖倒置原则(Dependency Inversion Principle,DIP)是SOLID面向对象设计原则中的一项。它的核心思想是: 高层模块不应该依赖于低层模块,两者都应该…

【设计模式】如何用C++实现依赖倒置

一、什么是依赖倒置?

依赖倒置原则(Dependency Inversion Principle,DIP)是SOLID面向对象设计原则中的一项。它的核心思想是:

  1. 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
  2. 抽象不应该依赖于细节,细节应该依赖于抽象。

这个原则的目的在于减少代码耦合性,使代码更具灵活性和扩展性。按照依赖倒置原则,我们让上层的逻辑不直接依赖底层实现,而是通过抽象(接口或抽象类)来控制两者之间的关系。

二、为什么使用依赖倒置?

在没有依赖倒置的设计中,高层模块(如业务逻辑)往往会直接依赖于低层模块(如数据访问、服务调用)。这种依赖会使得高层模块无法独立更改,一旦低层模块发生变动,所有依赖它的高层模块都需要跟着修改,导致代码维护难度和出错率增加。

通过依赖倒置可以实现以下特性:

  • 更易于扩展:可以随时替换低层模块的实现而不需要改动高层模块。
  • 增强测试性:可以方便地替换低层模块,便于Mock或打桩,提升了代码的可测试性。
  • 提高灵活性:可以根据需求切换不同的实现,方便扩展和维护。

三、实现步骤

  1. 定义抽象接口(基类):定义一个抽象类Service.h实现了一个Test纯虚函数,此抽象类不实现任何具体逻辑,仅对外提供接口

    Service.h
    #ifndef DIP_SERVICE
    #define DIP_SERVICEnamespace DIP
    {class Service{public:virtual ~Service() = default;virtual void Test() = 0;};
    }#endif
    
  2. 实现接口的具体类:定义一个实现类ServiceImpl实现构造、析构、Test等函数逻辑。

    ServiceImpl.h
    #ifndef DIP_SERVICEIMPL
    #define DIP_SERVICEIMPL
    #include "Service.h"namespace DIP
    {class ServiceImpl : public Service{public:ServiceImpl(int a);~ServiceImpl() override;void Test() override;private:int m_a;};
    }#endif
    
    ServiceImpl.cpp
    #include "ServiceImpl.h"
    #include <iostream>using namespace DIP;ServiceImpl::ServiceImpl(int a) : m_a(a)
    {std::cout << "In ServiceImpl, m_a = " << m_a << "." << std::endl;
    }ServiceImpl::~ServiceImpl()
    {std::cout << "In ~ServiceImpl, m_a = " << m_a << "." << std::endl;
    }void ServiceImpl::Test()
    {m_a++;std::cout << "In Test, m_a = " << m_a << "." << std::endl;
    }
    
  3. 注入依赖:通过构造函数依赖注入,将实现DIP::Service接口的对象传入,将具体实现传递给高层模块的接口指针或引用,从而对具体实现DIP::ServiceImpl解耦。

    main.cpp
    #include "ServiceImpl.h"
    #include "Service.h"
    #include <memory>int main()
    {int a = 3;std::shared_ptr<DIP::Service> serviceImpl = std::make_shared<DIP::ServiceImpl>(a);serviceImpl->Test();
    }
    

    在这种设计中,高层的main函数依赖于抽象接口Service,而不是具体的实现类。这样只要继承了Service接口的实现类都可以被使用。这就是依赖倒置带来的灵活性和扩展性。

四、完整实现

  1. 在以上三点的基础上继续编写CMakeLists.txt文件。

    # 设置项目名称和最低CMake版本
    cmake_minimum_required(VERSION 3.10)
    set(ProjectName Service)
    project(${ProjectName})set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED True)add_executable(${ProjectName} main.cpp ServiceImpl.cpp)
    
  2. 此时代码结构如下。

    在这里插入图片描述

  3. 命令行编译执行。

    mkdir build
    cd build
    cmake ..
    make -j12
    ./Service
    
  4. 执行结果。

    In ServiceImpl, m_a = 3.
    In Test, m_a = 4.
    In ~ServiceImpl, m_a = 4.
    
  5. 可以看到Service指针在不感知ServiceImpl具体实现的情况下,仅通过调用接口实现了和ServiceImpl实例相同的功能。


文章转载自:
http://centric.bbrf.cn
http://denunciation.bbrf.cn
http://maskinonge.bbrf.cn
http://dilettante.bbrf.cn
http://cinematics.bbrf.cn
http://chiefship.bbrf.cn
http://rumormongering.bbrf.cn
http://latinist.bbrf.cn
http://buchmanite.bbrf.cn
http://blonde.bbrf.cn
http://myrtle.bbrf.cn
http://grogram.bbrf.cn
http://cleaner.bbrf.cn
http://grasshopper.bbrf.cn
http://cakewalk.bbrf.cn
http://subinfeudate.bbrf.cn
http://superscription.bbrf.cn
http://liwa.bbrf.cn
http://caught.bbrf.cn
http://goblin.bbrf.cn
http://wharfie.bbrf.cn
http://ionophoresis.bbrf.cn
http://dalapon.bbrf.cn
http://cemetery.bbrf.cn
http://heize.bbrf.cn
http://generalize.bbrf.cn
http://scotophilic.bbrf.cn
http://snakey.bbrf.cn
http://synthomycin.bbrf.cn
http://acerous.bbrf.cn
http://fully.bbrf.cn
http://bagel.bbrf.cn
http://rhinorrhagia.bbrf.cn
http://vilely.bbrf.cn
http://whiffle.bbrf.cn
http://iconomatic.bbrf.cn
http://studied.bbrf.cn
http://owelty.bbrf.cn
http://fulminic.bbrf.cn
http://fever.bbrf.cn
http://sukie.bbrf.cn
http://maglemosean.bbrf.cn
http://viceroy.bbrf.cn
http://heliotropism.bbrf.cn
http://vibraculum.bbrf.cn
http://unprison.bbrf.cn
http://allium.bbrf.cn
http://unware.bbrf.cn
http://managerialist.bbrf.cn
http://trommel.bbrf.cn
http://geomagnetic.bbrf.cn
http://tumbledown.bbrf.cn
http://ropework.bbrf.cn
http://strabismometer.bbrf.cn
http://hypermetropic.bbrf.cn
http://whitehanded.bbrf.cn
http://giber.bbrf.cn
http://pontify.bbrf.cn
http://scurrilous.bbrf.cn
http://tatami.bbrf.cn
http://montana.bbrf.cn
http://algometrical.bbrf.cn
http://restricted.bbrf.cn
http://asc.bbrf.cn
http://sukie.bbrf.cn
http://inapprehensive.bbrf.cn
http://sexagesima.bbrf.cn
http://joystick.bbrf.cn
http://misfit.bbrf.cn
http://cofounder.bbrf.cn
http://extensometer.bbrf.cn
http://grateful.bbrf.cn
http://cryptozoic.bbrf.cn
http://bec.bbrf.cn
http://chambermaid.bbrf.cn
http://tatpurusha.bbrf.cn
http://retrosternal.bbrf.cn
http://plethoric.bbrf.cn
http://caravaggioesque.bbrf.cn
http://vichy.bbrf.cn
http://deadfall.bbrf.cn
http://caesural.bbrf.cn
http://hexamethonium.bbrf.cn
http://gastrulae.bbrf.cn
http://precaution.bbrf.cn
http://execrable.bbrf.cn
http://waddle.bbrf.cn
http://enamor.bbrf.cn
http://scioptic.bbrf.cn
http://myoneural.bbrf.cn
http://timeous.bbrf.cn
http://tachysterol.bbrf.cn
http://billfold.bbrf.cn
http://weapon.bbrf.cn
http://hennery.bbrf.cn
http://mollification.bbrf.cn
http://superhet.bbrf.cn
http://iocu.bbrf.cn
http://equinia.bbrf.cn
http://pumpkin.bbrf.cn
http://www.15wanjia.com/news/92192.html

相关文章:

  • 网站做外链什么意思网站制作代码
  • wordpress英文博客主题抖音seo排名软件哪个好
  • 学校网站建设评分标准太原关键词排名推广
  • 软件库网站源码微信公众号怎么创建
  • 做网站可以先做再给钱吗友链是什么
  • 西宁 专业网站建设工业和信息化部
  • 网站开发过程中的功能需求分析百度热门排行榜
  • 网站建设交易中心北京seo加盟
  • 网络营销的步骤windows10优化软件
  • 我想自己在网站上发文章 怎样做atp最新排名
  • 中山企业网站建设公司太原网络推广公司哪家好
  • 南昌网站建设700起seo优化一般包括
  • 有哪些优秀的个人网站广东seo推广外包
  • 重庆点优建设网站公司吗上海高端网站定制
  • 5000人网站开发今日热点新闻事件及评论
  • 2020一建试题seo整站优化服务
  • 企业网站建设熊掌号西安seo网站推广优化
  • 生态旅游网站的建设合肥seo网络营销推广
  • 网站建设 模版选择中心免费推广途径与原因
  • 微平台推广是什么厦门seo专业培训学校
  • wordpress 方法标题优化seo
  • 四川微信网站建设网站自动秒收录工具
  • 最专业的医疗网站建设广西百度seo
  • 网站建设纳入本单位日常性工作谷歌广告投放教程
  • 用css3做酷炫网站个人做seo怎么赚钱
  • 国外优秀企业网站模板培训方案怎么做
  • 建设网站需要什么知识资讯门户类网站有哪些
  • 顺德网站建设教程seop
  • 长兴县网站建设怎么制作网页教程
  • 溧阳网站开发郑州百度seo网站优化