开闭原则(C++)
2017-09-02 22:24
120 查看
概念
对于扩展是开放的,对于更改是封闭的。面对新的需求,对程序的改动是通过新加代码而进行的,不是更改现有的代码。简述
开闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中出现频繁变化的那些部分做出抽象,对于应用程序每个部分都刻意进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。场景一:
当前需要写一个加减法的计算器。可以这样实现。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;
}
相关文章推荐
- 开闭原则(Open-Closed Principle)
- 什么是开闭原则
- 漫谈面向对象基石之开闭原则(OCP)(转)
- 六大原则之“开闭原则(OCP)“笔记
- 开闭原则
- 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
- 设计模式系列课程08之【开闭原则】
- 设计模式六大原则(6):开闭原则
- [设计模式]<<设计模式之禅>>关于开闭原则
- 解析Java编程中设计模式的开闭原则的运用
- 开闭原则(OCP)
- 设计模式原则——开闭原则
- 开闭原则
- 模版方法模式与策略模式如何让软件开发符合“开闭原则”
- 开闭原则
- 设计原则 之开闭原则(Open Close Principle)
- 从开闭原则看工厂模式
- 简单工厂模式及实例之三个原则(开闭原则,依赖倒转原则,迪米特法则)
- 一个面向对象的JS例子,很好的支持了开闭原则(不要重复你昨天的代码)
- 设计模式六大原则6—开闭原则