设计模式,刚接触这个概念时有点困惑,我主学C和C++,也用MFC开发过一些小项目,不管功能实现的怎样,但也算全部实现了,并没有使用什么模式,并且,项目开发的过程中一直都是以功能实现即可为目标,但是接触到了这样一句话(本书希望能给渴望了解OO世界的初学者,困惑于僵硬,脆弱,无法复用的代码编程体验者,一直打着OO编程的旗号,做着过程式开发的基于对象的编程实践者一些建议和提示(我觉得就是说我呢),让我下定决心(离招聘以及为时不多的时候)来学习它。网上都说大话设计模式这本书很是不错,适合入门,那么我就以这本书来学习,并作出记录吧。
精彩的代码是如何想出来的,要比看到精彩的代码更加令人期待。
并且,重要的并不是将来会不会用到这些模式,而是通过这些模式让你找到“封装变化”,"对象间松散耦合“,”针对接口编程“的感觉,从而设计出易维护、易扩展、易复用、灵活性好的程序。
面试题目:基于控制台的计算器程序的编写
//代码无错便是优 suck
#include <IOSTREAM>
using namespace std;
class calcu
{
public:
double a; //命名规范 更改:NumberA;
double b;
char c; //更改:char Operater;
double value();
};
double calcu::value()
{
switch(c) //如果是if ,那么计算机要做三次判断,也就是三次无用功,所以在此if不
{
case '+': return a+b;break;
case '-': return a-b;break;
case '*': return a*b;break;
case '/': return a/b;break; //没有对被除数为 0 做出判断
更改:case '/': if(NumberB==0) return -1;
else {
return NumberA/NumberB;break;
}
}
return -1;
}
void main(){
calcu baby;
cin>>baby.a;
cin>>baby.b;
cin>>baby.c;
cout<<"so the value what want is ???"<<baby.value()<<endl;
}
所以说设计模式有四境界:
1.没学过,一点也不懂,根本想不到用设计模式,设计的代码很糟糕;
2.学过几个设计模式,于是到处使用,造成误用而不自知。
3.学完全部模式,感觉诸多模式及其相似,无法分清差异,有困惑,但深知误用之害,应用时很犹豫。
4.灵活应用模式,甚至不用具体的某种模式也能设计出非常优秀的代码。
第一章,代码无错就是优?---------简单工厂模式
/*
对酒当歌,人生几何 活字印刷术 的故事在反映着面向对象的特性:
第一。 改 为 可维护
第二。 并非无用 可复用
第三。 加减均可,可扩展
第四。 横竖排列,灵活性好
*/
当面对需求变化,对程序动大手术的无奈也就正常了,但是当通过封装,继承,多态把程序的耦合度降低。用设计模式使得程序更加灵活,容易修改,并且易于复用。
复制 vs 复用:当你的代码中,重复的代码多到一定程度的时候,维护可能就是一场灾难,系统越大,这种方式带来的问题越严重。所以编程原则:尽可能的办法去避免重复。
所以 业务的封装,<就是让业务逻辑和界面逻辑分开>(通过运算类),让他们之间的耦合度降下来。 是否容易维护 和可扩展 以及安全性之间 对应着关系的。
#include <IOSTREAM>
using namespace std;
class calcu
{
private:
double NumberA;
double NumberB;
char Operater;
public:
void set(double NumberA,double NumberB,char Operater);
double value();
};
void calcu::set(double NumberA,double NumberB,char Operater)
{
this->NumberA=NumberA;
this->NumberB=NumberB;
this->Operater=Operater;
}
double calcu::value()
{
switch(Operater)
{
case '+': return NumberA+NumberB;break;
case '-': return NumberA-NumberB;break;
case '*': return NumberA*NumberB;break;
case '/': if(NumberB==0) return -1;
else {
return NumberA/NumberB;break;
}
}
return -1;
}
void main(){
calcu baby;
double NumberA;
double NumberB;
char Operater;
cin>>NumberA;
cin>>NumberB;
cin>>Operater;
baby.set(NumberA,NumberB,Operater);
cout<<"so the value what want is ???\n"<<baby.value()<<endl;
}
//但是以上的代码,还没有做到完全面向对象,因为它只使用了三大特性之一。而如何应用继承和多态呢??
举例子:如果公司让你添加一个新的工作岗位的工资发放,那么 me=me * 1.1 ; 好形象,生动啊。
综上所述:应该把加减乘除等运算分离,修改其中一个并不影响另外的,增加也是,如何使用继承和多态:
#include <IOSTREAM>
using namespace std;
class Operator{
public:
double _NumberA,_NumberB;
void Set(double NumberA,double NumberB);
virtual double GetResult()
{
double result=0;
return result;
}
};
void Operator::Set(double NumberA,double NumberB)
{
_NumberA=NumberA;
_NumberB=NumberB;
}
class OperatorAdd :public Operator
{
public:
virtual double GetResult()
{
double result;
result=_NumberA+_NumberB;
return result;
}
};
class OperatorSub:public Operator
{
public:
virtual double GetResult()
{
double result;
result=_NumberA-_NumberB;
return result;
}
};
class OperatorMul:public Operator
{
public: //缺省的话是private
virtual double GetResult()
{
double result;
result=_NumberA*_NumberB;
return result;
}
};
class OperatorDiv:public Operator
{
public:
virtual double GetResult()
{
double result;
if(_NumberB==0)
{
printf("被除数不能为:0\n");
return -1;
}
else
{
result=_NumberA/_NumberB;
return result;
}
}
};
//如何实例化对象
void main(){
char operate;
cout<<"请输入所要进行的操作"<<endl;
cin>>operate; //作用域的问题
cout<<"请输入所要操作的两个数为:"<<endl;
double x,y;
cin>>x>>y;
// Operator oper;
switch(operate)
{
case '+':
{
OperatorAdd operAdd;
operAdd.Set(x,y);
cout<<operAdd.GetResult()<<endl;
}
break;
case '-':
{
OperatorSub operSub;
operSub.Set(x,y);
cout<<operSub.GetResult()<<endl;
}
break;
case '*':
{
OperatorMul operMul; //不恩能够去掉括号 operMul' is skipped by 'case' label
operMul.Set(x,y);
cout<<operMul.GetResult()<<endl;
}
break;
case '/':
{
OperatorDiv operDiv;
//为什么不能new呢???cannot convert from 'class OperatorDiv *' to 'class OperatorDiv'
operDiv.Set(x,y);
cout<<operDiv.GetResult()<<endl;
}
break;
}
// oper.Set(12,24);
// cout<<oper.GetResult()<<endl;
}