《大话设计模式》学习日记

《大话设计模式》学习日记



前言

在大学的最后一年进行基础知识的重新洗礼,在实际的实习生活中暴露了自己代码规范、编程思想种种问题,在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
{
publicdouble 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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值