设计模式——开闭原则

如今想设计这样的一个计算器类,对提交上来的数据进行运算并返回结果:

cpp 复制代码
class calculation
{
public:
	calculation(int a, int b, string op) :_a(a), _b(b), _op(op)
	{};
	int getret()
	{
		if (_op == "+")
			return _a + _b;
		if (_op == "-")
			return _a - _b;
		if (_op == "*")
			return _a * _b;
		if (_op == "/")
			return _a / _b;
	}
private:
	int _a;
	int _b;
	string _op;
	int _ret = 0;
};
void test()
{
	calculation* ca1 = new calculation(1, 1, "+");
	cout << ca1->getret()<<endl;
	calculation* ca2 = new calculation(1, 1, "*");
	cout << ca2->getret()<<endl;
}
int main()
{
	test();
	return 0;
}

但是这段代码存在问题:如果想对该计算器类增添新的功能,比如说取余或者开方等等。那么就需要修改函数内的代码,这样就导致了一个问题:我们在修改代码的时候可能会出错,导致一系列后果,这就是所谓的高耦合。但是我们想到的是低耦合的代码。所以可以将不同的运算分别写在一个类中。这样就避免了上述问题:

cpp 复制代码
#include<iostream>
using namespace std;
class getretClass
{
	virtual int getret() = 0;
};
class Plus:public getretClass
{
public:
	Plus(int a, int b) :_a(a), _b(b) {};
	virtual int getret()
	{
		return _a + _b;
	}
private:
	int _a;
	int _b;
};
class Minus:public getretClass
{
public:
	Minus(int a, int b) :_a(a), _b(b) {};
	virtual int getret()
	{
		return _a - _b;
	}
private:
	int _a;
	int _b;
};
// 其他运算省略了
void test()
{
	Plus* plus = new Plus(1, 2);
	cout << plus->getret() << endl;
	Minus* minus = new Minus(2, 1);
	cout << minus->getret() << endl;
}
int main()
{
	test();
	return 0;
}
相关推荐
谙弆悕博士17 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime18 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx19 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官19 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月20 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理
闻缺陷则喜何志丹21 小时前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
会编程的小孩21 小时前
C++ 内存分区、堆与栈、static、union 完整修正版文档
c++
多弗朗皮卡丘21 小时前
C++的类型转换
开发语言·c++
火2251 天前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
工一木子1 天前
设计模式与生活③:你的早晨,是一套模板
设计模式