设计模式之开闭原则

假如想象 提交于 2020-02-29 02:47:38

开放封闭原则(对扩展开放(Open for extension),对修改封闭(Closed for modification))是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所带来的巨大好处,也就是可维护、可扩展、可复用、灵活性好,开发人员应该仅对程序中频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

接下来以一个计算器类来作为开闭原则案例:

#include <iostream>
using namespace std;

//开闭原则:对扩展开放,对修改关闭;增加功能时,通过增加代码实现,而不是修改源代码。
//利用面向对象编程的:继承和多态来实现开闭原则 

//多态满足条件: 
//1、有继承关系
//2、子类重写父类中的虚函数
//多态使用:
//父类指针或引用指向子类对象

//写一个抽象类,具有纯虚函数的类称为抽象类 
class AbstractCaculator{
	public:
		virtual int getResult() = 0; //纯虚函数   函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
		virtual void setNum(int a,int b) = 0; 
}; 

//加法计算器 
class PlusCaculator : public  AbstractCaculator{    //1、有继承关系
	public:
		virtual void setNum(int a,int b){    //2、子类重写父类中的虚函数(重写:函数返回值类型,函数名,函数参数一致) 
			this->m_a = a;
			this->m_b = b;
		}
		virtual int getResult(){
			return m_a + m_b;
		}
	public:
		int m_a;
		int m_b;
};

//减法计算器
class MinusCaculator : public AbstractCaculator{
	public:
		virtual void setNum(int a,int b){
			this->m_a = a;
			this->m_b = b; 
		} 
		virtual int getResult(){
			return m_a - m_b;
		}
	public:
		int m_a;
		int m_b;
}; 

//以上实现了加法、减法功能,若需要增加乘法功能,只需要添加实现乘法功能的代码即可,无需修改源文件,即开闭原则。
//增加乘法功能
class MultiCaculator : public  AbstractCaculator{
	public:
		int m_a;
		int m_b;
	public:
		virtual void setNum(int a,int b){
			this->m_a = a;
			this->m_b = b; 
		} 
		virtual int getResult(){
			return m_a * m_b;
		} 
};

//测试
void test01(){
	
	AbstractCaculator* ac = new PlusCaculator; //多态的使用:父类指针或引用指向子类对象
	ac->setNum(10,20);
	cout<<"加法"<<ac->getResult()<<endl;
	delete ac;
	
	ac = new MinusCaculator;
	ac->setNum(100,1);
	cout<<"减法"<<ac->getResult()<<endl; 
	delete ac;
} 

void test02(){
	AbstractCaculator* ac = new MultiCaculator;
	ac->setNum(100,200);
	cout<<"乘法"<<ac->getResult()<<endl;
	delete ac; 
}

int main(int argc, char** argv) {
	test01();
	test02();
	return 0;
}

例子中所涉及的C++知识回顾:
1.封装

  • 将属性和行为作为一个整体
  • 将属性和行为加以权限控制
  • 语法:class 类名{ 访问权限: 属性 / 行为 };

2.继承

  • 有些类与类之间存在特殊的关系,我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码。
  • 语法:class A : public B;A称为子类或派生类,B称为父类或基类。

3.多态

  • 多态的满足条件:(1)有继承关系,(2)子类重写父类的虚函数(重写:函数的返回值,函数名,函数参数一致)。
  • 多态的使用条件:父类指针或引用指向子类。

4.this指针

  • 在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:这一块代码是如何区分哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象,this指针是隐含每一个非静态成员函数内的一种指针
    this指针不需要定义,直接使用即可。
  • this指针的用途:
    • 当形参和成员变量同名时,可用this指针来区分
    • 在类的非静态成员函数中返回对象本身,可使用return *this
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!