《设计模式》学习笔记——开闭原则

开闭原则(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;
}

猜你喜欢

转载自blog.csdn.net/smallerxuan/article/details/83338211