设计模式

设计模式,刚接触这个概念时有点困惑,我主学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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值