开闭原则(Open Close Principle)的关键在于对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是增加新的代码。使程序的扩展性好,易于维护和升级。接口和抽象类的使用能达到这种效果。
以下的代码通过模拟一个银行存钱业务,来进行举例说明:
BankWorker.h
#pragma once
#include<iostream>
#include<string>
// 开闭原则,添加新功能只能通过添加代码实现,不能修改原有框架
class BankWorker
{
public:
explicit BankWorker(void);
explicit BankWorker(std::string name, std::string depart = "Server") :m_BankWorkerName_string(name), m_BankWorkerDepart_string(depart) {}; // 禁止自动的隐式类型转换
virtual ~BankWorker(void); // 析构函数设置为虚析构函数,确保即便使用指针的情况下也能正常析构
std::string m_BankWorkerName_string; // 每个业务员应该有自己的名字
std::string m_BankWorkerDepart_string; // 每个业务员应该有自己的部门
virtual bool doSomething() = 0; // 纯虚函数,将BankWorker提升为接口类,
// 具体实现代码通过接口继承后利用多态调用实现
private:
protected:
};
// 具体类通过继承接口类,重写纯虚函数实现特定功能
// 存钱业务员
class BankWorker_seav : public BankWorker // 公有虚继承
{
public:
explicit BankWorker_seav(std::string name, std::string depart = "Seave"):BankWorker(name, depart){ };
~BankWorker_seav() {};
// 重写虚函数
bool doSomething()
{
std::cout << "您好!欢迎办理存钱业务!" <<"我是办理存钱的业务员"<<m_BankWorkerName_string<<",所属部门:" << m_BankWorkerDepart_string << std::endl;
return true;
}
private:
protected:
};
// 具体类通过继承接口类,重写纯虚函数实现特定功能
// VIP会员专属存钱业务员
class BankWorker_seav_vip : public BankWorker_seav // 公有虚继承
{
public:
explicit BankWorker_seav_vip(std::string name, std::string depart = "VIPSeave") : BankWorker_seav(name, depart) { };
~BankWorker_seav_vip() {};
// 重写虚函数
bool doSomething()
{
std::cout << "尊敬的VIP用户您好!我是您的专属业务员"<<m_BankWorkerName_string<<",所属部门:"<<m_BankWorkerDepart_string<<",欢迎办理存钱业务!" << std::endl;
return true;
}
private:
protected:
};
BankWorker.cpp
#include "BankWorker.h"
BankWorker::BankWorker(void)
{
}
BankWorker::~BankWorker(void)
{
}
MainTest.cpp
#include<iostream>
#include"BankWorker.h"
using namespace std;
int main(void)
{
BankWorker* aWorker_ptr = new BankWorker_seav(std::string{"小王"});
aWorker_ptr->doSomething(); // 多态调用,接口统一
delete aWorker_ptr;
aWorker_ptr = new BankWorker_seav_vip(std::string{ "小李" });
aWorker_ptr->doSomething(); // 多态调用,接口统一
delete aWorker_ptr;
aWorker_ptr = nullptr;
system("pause");
return 0;
}