(记录自己的学习历程,持续更新……)
本人将设计模式里边的代码用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、策略模式