国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++設(shè)計(jì)模式】開放-封閉原則

這篇具有很好參考價(jià)值的文章主要介紹了【C++設(shè)計(jì)模式】開放-封閉原則。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

2023年8月27日,周日下午

我覺得我的這篇博客還是寫得很不錯(cuò)的,哈哈哈。


目錄

  • 概述
  • 舉例說明
  • 用開放-封閉原則重構(gòu)

概述

開放-封閉原則(Open-Closed Principle,OCP)是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,也是許多設(shè)計(jì)模式的基礎(chǔ)。它由Bertrand Meyer在他的書《面向?qū)ο筌浖?gòu)造》中提出,并被廣泛應(yīng)用于軟件開發(fā)中。

開放-封閉原則的核心思想是:軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該對擴(kuò)展開放,對修改封閉。換句話說,當(dāng)需要修改一個(gè)軟件實(shí)體時(shí),應(yīng)該通過擴(kuò)展它的行為,而不是修改它的源代碼。

這個(gè)原則的目標(biāo)是實(shí)現(xiàn)軟件設(shè)計(jì)的穩(wěn)定性和可維護(hù)性。通過遵循開放-封閉原則,我們可以減少修改已有代碼的需求,從而降低了引入新錯(cuò)誤的風(fēng)險(xiǎn),并提高了代碼的可復(fù)用性

實(shí)現(xiàn)開放-封閉原則的關(guān)鍵是使用抽象和多態(tài)。通過定義抽象的接口或基類,可以將代碼與特定的實(shí)現(xiàn)分離開來。這樣,在需要變更行為時(shí),我們只需要?jiǎng)?chuàng)建新的實(shí)現(xiàn)類并基于抽象進(jìn)行擴(kuò)展,而不需要修改已有的代碼。

舉例說明

假如有一天,公司要我寫一個(gè)計(jì)算圓的面積的函數(shù)getArea

#include <iostream>

// 計(jì)算圓的面積
double getArea(double radius) {
	return 3.14159 * radius * radius;
}

int main() {
  // 計(jì)算面積
  double area = getArea(3);

  // 輸出面積
  std::cout << "area: " << area << std::endl;

  return 0;
}

這很簡單,是不是?

但是后來公司要求這個(gè)getArea函數(shù)要增加計(jì)算正方形的面積的功能,

假設(shè)我不懂開放-封閉原則,那么我只能老老實(shí)實(shí)修改getArea函數(shù)內(nèi)部的代碼

#include <iostream>

// 計(jì)算面積
double getArea(double num,std::string thing) {
	if(thing=="圓形")
		return 3.14159 * num * num;
	if(thing=="正方形")
		return num*num;
}

int main() {
  // 計(jì)算面積
  double area1 = getArea(3,"圓形");
  double area2=getArea(4,"正方形");
  // 輸出面積
  std::cout << "圓形面積: " << area1 << std::endl;
  std::cout << "正方形面積: " << area2 << std::endl;

  return 0;
}

雖然我也完成了任務(wù),但可以看到getArea函數(shù)變得復(fù)雜了:參數(shù)由1個(gè)變成2個(gè);內(nèi)部的實(shí)現(xiàn)代碼也更多了。

但是任務(wù)還沒結(jié)束,后來公司又讓我給getArea函數(shù)添加計(jì)算長方形的功能

#include <iostream>

// 計(jì)算面積
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() {
  // 計(jì)算面積
  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函數(shù)不僅變得更加難以理解,而且變得更加復(fù)雜了:參數(shù)由2個(gè)變成3個(gè),而且內(nèi)部代碼實(shí)現(xiàn)也變多了。

接下來就不用寫,照這么寫下去,隨著需求的增多,getArea函數(shù)只會(huì)變得越來越復(fù)雜和難以理解。

用開放-封閉原則重構(gòu)

不難看出,在getArea中不變的是要返回一個(gè)面積,不斷變化的是不同圖形的計(jì)算方法,

所以可以封閉getArea的”返回一個(gè)面積“,而開放”計(jì)算方法“。

我把所有圖形抽象成一個(gè)Shape抽象類,要求所有Shape抽象類的派生類都必須提供一個(gè)返回面積的接口。至于這些派生類怎么實(shí)現(xiàn)父類Shape要求的返回面積的接口,就各顯神通、因地制宜了,此之謂”開放擴(kuò)展“

而getArea函數(shù)只需雷打不動(dòng)地調(diào)用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;
  }
};

// 計(jì)算所有圖形的總面積
double getArea(const Shape* shape) {
  return shape->area();
}

int main() {
  // 創(chuàng)建矩形和圓形對象
  Circle circle(3);
  Rectangle rect1(4, 4);
  Rectangle rect2(4, 3);

  // 計(jì)算總面積
  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;
}

可以看到,無論公司要求增加什么圖形的計(jì)算面積功能,都不需要修改getArea函數(shù),

只需要增加一個(gè)繼承自Shape類的派生類就可以了,

不信的話,你們可以再添加一個(gè)計(jì)算梯形的面積試試,就當(dāng)作一個(gè)小作業(yè)。文章來源地址http://www.zghlxwxcb.cn/news/detail-684679.html

到了這里,關(guān)于【C++設(shè)計(jì)模式】開放-封閉原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++設(shè)計(jì)模式】依賴倒轉(zhuǎn)原則

    2023年8月30日,周三上午 目錄 概述 含義 舉個(gè)簡單的例子 傳統(tǒng)做法 使用依賴倒轉(zhuǎn)原則 代碼說明 再舉一個(gè)具體的例子 以生活為例 依賴倒轉(zhuǎn)原則(Dependency Inversion Principle,DIP)是面向?qū)ο笤O(shè)計(jì)中的一個(gè)基本原則。 含義 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象。 也就是

    2024年02月10日
    瀏覽(26)
  • 【8】c++設(shè)計(jì)模式——>單一職責(zé)原則

    C++面向?qū)ο笕筇匦灾坏?封裝 指的就是將單一事物抽象出來組合成一個(gè)類,所以我們在設(shè)計(jì)類的時(shí)候每個(gè)類中處理的是單一事物而不是某些事物的集合。讓類的功能單一,不讓類與具體的事物耦合。 設(shè)計(jì)模式中所謂的單一職責(zé)原則,就是對一個(gè)類而言,應(yīng)該僅有一個(gè)引起

    2024年02月07日
    瀏覽(21)
  • C++設(shè)計(jì)模式_02_面向?qū)ο笤O(shè)計(jì)原則

    變化是復(fù)用的天敵!面向?qū)ο笤O(shè)計(jì)或者說使用了抽象原則的面向?qū)ο笤O(shè)計(jì)最大的優(yōu)勢在于#

    2024年02月11日
    瀏覽(21)
  • 【Python】新手入門學(xué)習(xí):詳細(xì)介紹開放封閉原則(OCP)及其作用、代碼示例

    【Python】新手入門學(xué)習(xí):詳細(xì)介紹開放封閉原則(OCP)及其作用、代碼示例

    【Python】新手入門學(xué)習(xí):詳細(xì)介紹開放封閉原則(OCP)及其作用、代碼示例 ?? 個(gè)人主頁:高斯小哥 ?? 高質(zhì)量專欄:Matplotlib之旅:零基礎(chǔ)精通數(shù)據(jù)可視化、Python基礎(chǔ)【高質(zhì)量合集】、PyTorch零基礎(chǔ)入門教程?? 希望得到您的訂閱和支持~ ?? 創(chuàng)作高質(zhì)量博文(平均質(zhì)量分92+),分

    2024年03月14日
    瀏覽(26)
  • 【設(shè)計(jì)模式】設(shè)計(jì)原則-里氏替換原則

    定義 任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 通俗理解:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。 換句話說,子類繼承父類時(shí),除添加新的方法完成新增功能外,盡量不要重寫父類的方法。 針對的問題 主要作用就是規(guī)范繼承時(shí)子類的一些書寫規(guī)則。

    2024年02月14日
    瀏覽(30)
  • 【設(shè)計(jì)模式】設(shè)計(jì)原則-開閉原則

    定義 作用 1、方便測試;測試時(shí)只需要對擴(kuò)展的代碼進(jìn)行測試。 2、提高代碼的可復(fù)用性;粒度越小,被復(fù)用的可能性就越大。 3、提高軟件的穩(wěn)定性和延續(xù)性,易于擴(kuò)展和維護(hù)。 實(shí)現(xiàn)方式 通過“抽象約束、封裝變化”來實(shí)現(xiàn)開閉原則。通過接口或者抽象類為軟件實(shí)體定義一

    2024年02月15日
    瀏覽(23)
  • 前端設(shè)計(jì)模式和設(shè)計(jì)原則之設(shè)計(jì)原則

    1 開閉原則 該原則指出軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該 對擴(kuò)展開放,對修改關(guān)閉 。也就是說,在添加新功能時(shí),應(yīng)該通過擴(kuò)展現(xiàn)有代碼來實(shí)現(xiàn),而不是直接修改已有的代碼。這樣可以確?,F(xiàn)有代碼的穩(wěn)定性,并且減少對其他部分的影響。 在上述例子中,有一個(gè)原始功能

    2024年02月07日
    瀏覽(51)
  • 【Java 設(shè)計(jì)模式】設(shè)計(jì)原則之里氏替換原則

    在軟件開發(fā)中,設(shè)計(jì)原則是創(chuàng)建靈活、可維護(hù)和可擴(kuò)展軟件的基礎(chǔ)。 這些原則為我們提供了指導(dǎo)方針,幫助我們構(gòu)建高質(zhì)量、易理解的代碼。 ?單一職責(zé)原則(SRP) ?開放/封閉原則(OCP) ?里氏替換原則(LSP) ?依賴倒置原則(DIP) ?接口隔離原則(ISP) ?合成/聚合復(fù)

    2024年01月20日
    瀏覽(35)
  • 設(shè)計(jì)模式——設(shè)計(jì)模式以及六大原則概述

    設(shè)計(jì)模式——設(shè)計(jì)模式以及六大原則概述

    設(shè)計(jì)模式代表有經(jīng)驗(yàn)的面向?qū)ο筌浖_發(fā)人員使用的最佳實(shí)踐。 設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。 這些解決方案是由許多軟件開發(fā)人員在相當(dāng)長的時(shí)間內(nèi)通過試錯(cuò)獲得的。 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四

    2024年02月13日
    瀏覽(22)
  • 設(shè)計(jì)模式的設(shè)計(jì)原則

    設(shè)計(jì)模式的設(shè)計(jì)原則

    為什么需要設(shè)計(jì)模式? 我的理解設(shè)計(jì)模式就是一種針對某種問題的套路,是一套被反復(fù)使用,多數(shù)人所知曉的,經(jīng)過分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。 1.開閉原則 1.1 定義: ????一個(gè)軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉,即軟件實(shí)體應(yīng)盡量在不修改原有代碼下進(jìn)行擴(kuò)展

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包