1. 程式人生 > >開閉原則(C++)

開閉原則(C++)

概念

對於擴充套件是開放的,對於更改是封閉的。面對新的需求,對程式的改動是通過新加程式碼而進行的,不是更改現有的程式碼。

簡述

開閉原則是面向物件設計的核心所在。遵循這個原則可以帶來面向物件技術所聲稱的巨大好處,也就是可維護,可擴充套件,可複用,靈活性好。開發人員應該僅對程式中出現頻繁變化的那些部分做出抽象,對於應用程式每個部分都刻意進行抽象同樣不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要。

場景一:

   當前需要寫一個加減法的計算器。可以這樣實現。

UML類圖:

程式碼:

#include <stdio.h>
#include <iostream>

//計算器類
class Calculator
{
public:
	Calculator()
	{

	}
	~Calculator() {};

	double getompute(char c)
	{
		switch (c)
		{
		case '+':
			return mA + mB;
			break;
		case '-':
			return mA - mB;
			break;
		default:
			break;
		}
	}
public:
	double mA;
	double mB;
};

//客戶端
int main(void)
{
	Calculator calculator;

	while (true)
	{
		std::cout << "請輸入數字:";
		std::cin >> calculator.mA;
		std::cout << "請輸入數字:";
		std::cin >> calculator.mB;
		std::cout << "進行計算:";
		char c = '0';
		std::cin >> c;
		
		std::cout << "計算結果:" << calculator.getompute(c) << std::endl;
	}

	return 0;
}

場景二:

    由於需求變化,現在需要加上乘法和除法。

程式碼:

//計算器類
class Calculator
{
public:
	Calculator()
	{

	}
	~Calculator() {};

	double getompute(char c)
	{
		switch (c)
		{
		case '+':
			return mA + mB;
			break;
		case '-':
			return mA - mB;
			break;
		case '*':
			return mA * mB;
			break;
		case '/':
			return mA / mB;
			break;
		default:
			break;
		}
	}
public:
	double mA;
	double mB;
};

    修改後也可以實現功能,但如果需要再新增開方,取餘等功能。必須再次修改Calculator,明顯違背了開閉原則。

場景三:

   對Calculator進行改進

UML類圖:

程式碼:

#include <stdio.h>
#include <iostream>

//計算器類  
class Calculator
{
public:
	Calculator()
	{

	}
	~Calculator() {};

	//抽象介面類,子類實現
	virtual double getompute()
	{
		return 0;
	}
public:
	double mA;
	double mB;
};

//除
class Division : public Calculator
{
public:
	virtual double getompute()
	{
		return mA / mB;
	}
};
//乘
class Multiplication : public Calculator
{
public:
	virtual double getompute()
	{
		return mA * mB;
	}
};
//減
class Subtraction : public Calculator
{
public:
	virtual double getompute()
	{
		return mA - mB;
	}
};
//加
class Addition : public Calculator
{
public:
	virtual double getompute()
	{
		return mA + mB;
	}
};

//工廠,根據不同的計算方式生產類
Calculator* CreateCalculator(char c)
{
	switch (c)
	{
	case '+':
		return new Addition;
		break;
	case '-':
		return new Subtraction;
		break;
	case '*':
		return new Multiplication;
		break;
	case '/':
		return new Division;
		break;

	default:
		return NULL;
		break;
	}
}

//客戶端
int main(void)
{
	Calculator *calculator = NULL;

	calculator = CreateCalculator('-');

	calculator->mA = 10;
	calculator->mB = 5;
	std::cout << "計算結果:" << calculator->getompute() << std::endl;

	while (true) {};
	return 0;
}