从《大话设计模式》理解到的……

(记录自己的学习历程,持续更新……)

本人将设计模式里边的代码用C++语言模仿了一遍,这个过程才让我头一次明白什么是面向对象,也真实体会到以前在MFC上写代码确实难窥C++全貌,MFC只需要知道在哪个类里面写什么代码就行了,对于整个框架的运行过程都可以不用完全熟悉。

1、简单工厂模式

//Operation.h实现
#ifndef OPERATION_H
#define OPERATION_H
class Operation
{
public:
	double numberA;
	double numberB;
	virtual double GetResult();
};
#endif

//Operation.cpp
#include "stdafx.h"   //这个头文件要放在最前面
#include "Operation.h"
using namespace std;

double Operation::GetResult()
{
	double result = 0.0;
	return result;
}

//OperationAdd.h
#ifndef OPERATONADD_H
#define OPERATONADD_H

#include "Operation.h"

class OperationAdd: public Operation 
{
public:
	virtual double GetResult(); 
};

#endif

//OperationAdd.cpp

#include "stdafx.h"

#include "OperationAdd.h"
#include "Operation.h"
using namespace std;

double OperationAdd::GetResult()
{
	//operation* oper = OperationFactory::createOperation('+');
	double result = 0.0;
	result = numberA + numberB;
	return result;
}


//OperationDiv.h
#ifndef OPERATIONDIV_H
#define OPERATIONDIV_H
#include "Operation.h"
class OperationDiv : public Operation
{
	virtual double GetResult();
};
#endif

 
//OperationDiv.cpp
#include "stdafx.h"
#include "OperationDiv.h"
#include <iostream>
using namespace std;

double OperationDiv::GetResult()
{
	double result = 0.0;
	if(numberB != 0)
		result = numberA / numberB;
	else
	{
		cout << "除数不能为0" << endl;
		return false;
	}
	return result;
}
 

//OperationMul.h
#ifndef OPERATIONMUL_H
#define OPERATIONMUL_H

#include "Operation.h"

class OperationMul : public Operation
{
public:
	virtual double GetResult();
};
#endif

//OperationMul.cpp
#include "stdafx.h"
#include "OperationMul.h"

double OperationMul::GetResult()
{
	double result = 0.0;
	result = numberA * numberB;
	return result;
}


//OperationSub.h
#ifndef OPERATIONSUB_H
#define OPERATIONSUB_H

#include "Operation.h"

class OperationSub : public Operation
{
public:
	virtual double GetResult();

};
#endif

//OperationSub.cpp
#include "stdafx.h"
#include "OperationSub.h"
#include "Operation.h"
using namespace std;

double OperationSub::GetResult()
{
	double result = 0.0;
	result = numberA - numberB;
	return result;
}

//OperationFactory.h
#ifndef OPERATIONFACTORY_H
#define OPERATIONFACTORY_H

#include "Operation.h"
class OperationFactory
{
public:
	static Operation* createOperation(char operate);

};

#endif


//OperationFactory.cpp
#include "OperationFactory.h"
#include "Operation.h"
using namespace std;

Operation* OperationFactory::createOperation(char operate)
{
	Operation* oper = NULL;
	switch (operate)
	{
	case '+':
		oper = new OperationAdd;
		break;
	case '-':
		oper = new OperationSub;
		break;
	case '*':
		oper = new OperationMul;
		break;
	case '/':
		oper = new OperationDiv;
		break;
	default:
		break;
	}
	return oper;
}


 
// main.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "Operation.h"
#include "OperationAdd.h"
#include "OperationSub.h"
#include "OperationFactory.h"
#include "OperationMul.h"
#include <iostream>
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Operation* operAdd;
	operAdd = OperationFactory::createOperation('+');
	operAdd->numberA = 1;
	operAdd->numberB = 2;
	double resultAdd = operAdd->GetResult();

	Operation* operSub;
	operSub = OperationFactory::createOperation('-');
	operSub->numberA = 12.3;
	operSub->numberB = 2.3;
	double resultSub = operSub->GetResult();

	Operation* operMul;
	operMul = OperationFactory::createOperation('*');
	operMul->numberA = 4;
	operMul->numberB = 5;
	double resultMul = operMul->GetResult();

	Operation* operDiv;
	operDiv = OperationFactory::createOperation('/');
	operDiv->numberB = 2;
	operDiv->numberA = 9;
	double resultDiv = operDiv->GetResult();
	cout <<  "两数相加 " << resultAdd << endl;
	cout << "两数相减 " << resultSub << endl;
	cout << "两数相乘 " << resultMul << endl;
	cout << "两数相除 " << resultDiv << endl;
	return 0;
}


工厂模式的精华在于OperationFactory类,该类能够根据对应的运算符号生成对应的类,然后利用多态,利用指向派生类对象的基类指针调用GetResult()这个虚函数,实现对应的运算。这样就能做到,我们需要任何运算(例如根号运算),新建一个根号类派生于Operation,修改GetResult()函数,然后在Operation* createOperation(char operate)  函数中添加该运算分支就可以。




2、策略模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值