【C++设计模式】开放-封闭原则

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

2023年8月27日,周日下午

我觉得我的这篇博客还是写得很不错的,哈哈哈。


目录

  • 概述
  • 举例说明
  • 用开放-封闭原则重构

概述

开放-封闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则,也是许多设计模式的基础。它由Bertrand Meyer在他的书《面向对象软件构造》中提出,并被广泛应用于软件开发中。

开放-封闭原则的核心思想是:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。换句话说,当需要修改一个软件实体时,应该通过扩展它的行为,而不是修改它的源代码。

这个原则的目标是实现软件设计的稳定性和可维护性。通过遵循开放-封闭原则,我们可以减少修改已有代码的需求,从而降低了引入新错误的风险,并提高了代码的可复用性

实现开放-封闭原则的关键是使用抽象和多态。通过定义抽象的接口或基类,可以将代码与特定的实现分离开来。这样,在需要变更行为时,我们只需要创建新的实现类并基于抽象进行扩展,而不需要修改已有的代码。

举例说明

假如有一天,公司要我写一个计算圆的面积的函数getArea

#include <iostream>

// 计算圆的面积
double getArea(double radius) {
	return 3.14159 * radius * radius;
}

int main() {
  // 计算面积
  double area = getArea(3);

  // 输出面积
  std::cout << "area: " << area << std::endl;

  return 0;
}

这很简单,是不是?

但是后来公司要求这个getArea函数要增加计算正方形的面积的功能,

假设我不懂开放-封闭原则,那么我只能老老实实修改getArea函数内部的代码

#include <iostream>

// 计算面积
double getArea(double num,std::string thing) {
	if(thing=="圆形")
		return 3.14159 * num * num;
	if(thing=="正方形")
		return num*num;
}

int main() {
  // 计算面积
  double area1 = getArea(3,"圆形");
  double area2=getArea(4,"正方形");
  // 输出面积
  std::cout << "圆形面积: " << area1 << std::endl;
  std::cout << "正方形面积: " << area2 << std::endl;

  return 0;
}

虽然我也完成了任务,但可以看到getArea函数变得复杂了:参数由1个变成2个;内部的实现代码也更多了。

但是任务还没结束,后来公司又让我给getArea函数添加计算长方形的功能

#include <iostream>

// 计算面积
double getArea(double num1,double num2,std::string thing) {
	if(thing=="圆形")
		return 3.14159 * num1 * num1;
	if(thing=="正方形")
		return num1*num1;
	if(thing=="长方形")
		return num1*num2;
}

int main() {
  // 计算面积
  double area1 = getArea(3,0,"圆形");
  double area2=getArea(4,0,"正方形");
  double area3=getArea(4,3,"长方形");
  // 输出面积
  std::cout << "圆形面积: " << area1 << std::endl;
  std::cout << "正方形面积: " << area2 << std::endl;
  std::cout << "长方形面积: " << area3 << std::endl;

  return 0;
}

可以看出来,我的getArea函数不仅变得更加难以理解,而且变得更加复杂了:参数由2个变成3个,而且内部代码实现也变多了。

接下来就不用写,照这么写下去,随着需求的增多,getArea函数只会变得越来越复杂和难以理解。

用开放-封闭原则重构

不难看出,在getArea中不变的是要返回一个面积,不断变化的是不同图形的计算方法,

所以可以封闭getArea的”返回一个面积“,而开放”计算方法“。

我把所有图形抽象成一个Shape抽象类,要求所有Shape抽象类的派生类都必须提供一个返回面积的接口。至于这些派生类怎么实现父类Shape要求的返回面积的接口,就各显神通、因地制宜了,此之谓”开放扩展“

而getArea函数只需雷打不动地调用Shape类的派生类的返回面积的接口就可以了,此之谓”封闭修改“。

#include <iostream>

// 抽象基类,用于表示图形形状
class Shape {
public:
  virtual double area() const = 0;
};

// 具体的图形形状:矩形
class Rectangle : public Shape {
public:
  double width;
  double height;

  Rectangle(double w, double h) : width(w), height(h) {}

  double area() const override {
    return width * height;
  }
};

// 具体的图形形状:圆形
class Circle : public Shape {
public:
  double radius;

  Circle(double r) : radius(r) {}

  double area() const override {
    return 3.14159 * radius * radius;
  }
};

// 计算所有图形的总面积
double getArea(const Shape* shape) {
  return shape->area();
}

int main() {
  // 创建矩形和圆形对象
  Circle circle(3);
  Rectangle rect1(4, 4);
  Rectangle rect2(4, 3);

  // 计算总面积
  double area1 = getArea(&circle);
  double area2=getArea(&rect1);
  double area3=getArea(&rect2);

  // 输出面积
  std::cout << "圆形面积: " << area1 << std::endl;
  std::cout << "正方形面积: " << area2 << std::endl;
  std::cout << "长方形面积: " << area3 << std::endl;

  return 0;
}

可以看到,无论公司要求增加什么图形的计算面积功能,都不需要修改getArea函数,

只需要增加一个继承自Shape类的派生类就可以了,

不信的话,你们可以再添加一个计算梯形的面积试试,就当作一个小作业。文章来源地址https://www.toymoban.com/news/detail-684679.html

到了这里,关于【C++设计模式】开放-封闭原则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C++设计模式】依赖倒转原则

    2023年8月30日,周三上午 目录 概述 含义 举个简单的例子 传统做法 使用依赖倒转原则 代码说明 再举一个具体的例子 以生活为例 依赖倒转原则(Dependency Inversion Principle,DIP)是面向对象设计中的一个基本原则。 含义 高层模块不应该依赖低层模块,两者都应该依赖其抽象。 也就是

    2024年02月10日
    浏览(38)
  • 【8】c++设计模式——>单一职责原则

    C++面向对象三大特性之一的 封装 指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。让类的功能单一,不让类与具体的事物耦合。 设计模式中所谓的单一职责原则,就是对一个类而言,应该仅有一个引起

    2024年02月07日
    浏览(39)
  • C++设计模式_02_面向对象设计原则

    变化是复用的天敌!面向对象设计或者说使用了抽象原则的面向对象设计最大的优势在于#

    2024年02月11日
    浏览(52)
  • 【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

    【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分

    2024年03月14日
    浏览(49)
  • 【设计模式】设计原则-开闭原则

    定义 作用 1、方便测试;测试时只需要对扩展的代码进行测试。 2、提高代码的可复用性;粒度越小,被复用的可能性就越大。 3、提高软件的稳定性和延续性,易于扩展和维护。 实现方式 通过“抽象约束、封装变化”来实现开闭原则。通过接口或者抽象类为软件实体定义一

    2024年02月15日
    浏览(37)
  • 【设计模式】设计原则-里氏替换原则

    定义 任何基类可以出现的地方,子类一定可以出现。 通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。 换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。 针对的问题 主要作用就是规范继承时子类的一些书写规则。

    2024年02月14日
    浏览(49)
  • 前端设计模式和设计原则之设计原则

    1 开闭原则 该原则指出软件实体(类、模块、函数等)应该 对扩展开放,对修改关闭 。也就是说,在添加新功能时,应该通过扩展现有代码来实现,而不是直接修改已有的代码。这样可以确保现有代码的稳定性,并且减少对其他部分的影响。 在上述例子中,有一个原始功能

    2024年02月07日
    浏览(39)
  • 【Java 设计模式】设计原则之里氏替换原则

    在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则(OCP) ✨里氏替换原则(LSP) ✨依赖倒置原则(DIP) ✨接口隔离原则(ISP) ✨合成/聚合复

    2024年01月20日
    浏览(44)
  • 设计模式——设计模式以及六大原则概述

    设计模式代表有经验的面向对象软件开发人员使用的最佳实践。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是由许多软件开发人员在相当长的时间内通过试错获得的。 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四

    2024年02月13日
    浏览(51)
  • 设计模式的设计原则

    为什么需要设计模式? 我的理解设计模式就是一种针对某种问题的套路,是一套被反复使用,多数人所知晓的,经过分类编目的,代码设计经验的总结。 1.开闭原则 1.1 定义:     一个软件实体应当对扩展开放,对修改关闭,即软件实体应尽量在不修改原有代码下进行扩展

    2024年02月09日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包