通過題目“使用物件導向程式設計語言實現一個控制台程式,要求輸入兩個數和運算子號,得到結果”
引出【物件導向編程】,指出三個重要特性
- 封裝
- 繼承
- 多態
指出了編程的要求:
- 可維護
- 可複用
- 可擴充
這裡小結一下設計的思路:按照題目要求,可以分為以下幾個步驟,
那這裡涉及到【邏輯部分】和【顯示部分】在【邏輯部分】中,我們考慮要建立類去計算,那麼這個類顯然應該是【運算類】Operation為什嗎?——如果需求要求增加一種運算叫做“fight”,也就是“x fight y”,那麼從物件導向的可擴充性考慮,這個時候,我們應該是簡單的增加一個與fight相關的類,從而完成這種擴充要求,而fight是一種運算,因而,顯然是需要增加一個fight運算類。於是可以推出,除了fight運算類之外,之前還有很多的運算類,因此,可以設計一個運算基類,這些具體運算類設計為運算基類的子類。從而獲得具體的運算基類和運算類如下:【運算類基類】
class Operator{public:Operator(void);virtual ~Operator(void);virtual double GetResult() const = 0; public: double _numberFirst = 0; double _numberSecond = 0;};Operator::Operator(void){}Operator::~Operator(void){}
【加法運算類】
/*加法運算類*/class OperatorAdd : public Operator{public:OperatorAdd(void);virtual ~OperatorAdd(void);virtual double GetResult() const;};OperatorAdd::OperatorAdd(void){std::cout << "加法運算類建構函式" << std::endl;}OperatorAdd::~OperatorAdd(void){}double OperatorAdd::GetResult() const{ std::cout << "調用加法類的GetResult方法" << std::endl; double result = _numberFirst + _numberSecond;return result;}【減法運算類】
/*減法運算類*/class OperatorSub :public Operator{public:OperatorSub(void);virtual ~OperatorSub(void);virtual double GetResult() const;};OperatorSub::OperatorSub(void){std::cout << "減法運算類建構函式" << std::endl;}OperatorSub::~OperatorSub(void){}double OperatorSub::GetResult() const{std::cout << "調用減法類的GetResult方法" << std::endl;double result = _numberFirst - _numberSecond;return result;}
【簡單工廠類】針對輸入,返回對應的運算類
/* 工廠類 */#include <cassert>class OperatorFactory{public:OperatorFactory(void);~OperatorFactory(void); public: /* 靜態Factory 方法 */static Operator * CreateOperator(const std::string & model);};OperatorFactory::OperatorFactory(void){}OperatorFactory::~OperatorFactory(void){}Operator * OperatorFactory::CreateOperator(const std::string & model){if (model == "+"){return new OperatorAdd();}else if (model == "-"){return new OperatorSub();}else{assert(false);}return NULL;}【main】
int main(int argc, const char * argv[]){Operator * ope = NULL;std::string modeName = "-";ope = OperatorFactory::CreateOperator(modeName); ope->_numberFirst = 4; ope->_numberSecond = 5;cout << ope->GetResult(); delete ope;ope = NULL;return 0;}
【輸出結果】
減法運算類建構函式
調用減法類的GetResult方法
-1