《大话设计模式》学习日记
前言
在大学的最后一年进行基础知识的重新洗礼,在实际的实习生活中暴露了自己代码规范、编程思想种种问题,在Colin的推荐下开启代码规范和思想的学习。实际学习是结合《高质量C和C++编程指南》和《大话设计模式》。
一、工厂模式学习
1. 面向对象的本质
书中借用了曹操写诗,一次一改场景下印刷工人的苦恼。面向对象在实际的应用开发和维护中如“活字印刷”一般,灵活便捷。
“第一,要改,只需更改要改之字,此为可维护:第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用:第三,此诗若要加字,只需另刻字加入即可,这是可扩展;第四,字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。”
--------《大话设计模式》1.5节面向对象活字印刷
2.类与类,接口与接口的关系
“类是对对象的抽象,抽象类是对类的抽象,而接口是对行为的抽象。”
1)结构上的区别
- 普通类:数据+方法+实现
- 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现
- 接口类:方法(纯虚方法)
2)概念上的区别
- 抽象类:花
- 普通类:玫瑰(继承花类)
- 接口类:气味、颜色、花语
**
3. 工程模式的运用
**
进行简单的加减乘除运算。
#include<iostream>
#include<stdio.h>
#include<string>
#include<atlstr.h>
using namespace std;
class Operation
{
protected :
double NumA;
double NumB;
public:
~Operation(void){};
double getNumA(void){return NumA;};
void setNumA(double a){NumA=a;};
double getNumB(void){return NumB;};
void setNumB(double b){NumB=b;};
virtual double getResult() = 0;
};
class NumAdd:public Operation
{
public:
double getResult(void)
{
return NumA+NumB;
}
};
class NumSub:public Operation
{
public:
double getResult(void)
{
return NumA-NumB;
}
};
class NumMul:public Operation
{
public:
double getResult(void)
{
return NumA*NumB;
}
};
class NumDiv:public Operation
{
public:
double getResult(void)
{
if((NumB>-0.001)&&(NumB<0.001))
{
throw exception("分母不能为0");
}
else
{
return NumA/NumB;
}
}
};
class OperationFactory
{
public:
OperationFactory()
{
operation = NULL;
}
Operation* CreateOperate( char op )
{
switch( op )
{
case '+':
operation = new NumAdd();
break;
case '-':
operation = new NumSub();
break;
case '*':
operation = new NumMul();
break;
case '/':
operation = new NumDiv();
break;
default:
throw exception("操作符错误");
}
return operation;
}
~OperationFactory()
{
delete operation;
}
private:
Operation* operation;
};
int main()
{
double NumA=0;
double NumB=0;
char c=NULL;
Operation *operat=NULL;
OperationFactory fanctory;
cout<<"请输入数字a:";
cin>>NumA;
cout<<"请输入运算符号:(+,-,*,/)";
cin>>c;
cout<<"请输入数字b:";
cin>>NumB;
try
{
operat=fanctory.CreateOperate(c);
}
catch(exception &e)
{
throw(e.what());
exit(1);
}
operat->setNumA(NumA);
operat->setNumB(NumB);
double Result;
try
{
Result=operat->getResult();
}
catch(exception &e)
{
throw(e.what());
exit(1);
}
cout<<"计算结果为:"<<Result;
while(1);
}