把網球計分招式重構到狀態模式

2021-09-06 10:42:54 字數 995 閱讀 4343

剛剛把網球計分招式重構到狀態模式。

過程:

1)先實現沒有領先(no ad)情況的簡單的計分,並重構到狀態模式

網球計分

1.1)如果第一位選手先贏了4個球(point),那麼這位選手就贏了一局(game)。

1.2)每一局的計分用網球界特有的方式來統計:贏0、1、2、3個球,分別計love、15、30、40分。

2)再考慮有領先情況的計分

網球計分

2.1)如果第一位選手總共贏了至少4個球(point),並且至少比對手多贏2個球,那麼這位選手就贏了一局(game)。

2.2)每一局的計分用網球界特有的方式來統計:贏0、1、2、3個球,分別計love、15、30、40分。

2.3)如果每位選手都已經贏了至少3個球,且得分相同,那麼每位選手就稱為「平分(deuce)」。

2.4)如果每位選手都已經贏了至少3個球,並且其中一位選手比對方多贏1球,那麼該選手稱為「領先(advantage)」。

下面是一些體會。

* 1) 重構到模式是在模式的意圖方向的驅動下從沒有模式的**一點點「雕刻」出來的,而不是照著模式空降幾個類堆出來的。

* 2)重構到state模式的「雕刻」步驟:

* 2.1)先不考慮設計模式,用if或switch語句實現業務邏輯

* 2.2)建立context類,並把業務邏輯移動到該處

* 2.3)建立state抽象類,並在context中通過持有state物件,把業務邏輯委託到state抽象類完成

* 2.4)在state的子類中實現具體業務邏輯,從而消除if或switch語句,並在其中將下一狀態儲存到context持有的state域中,作為context持有的新的狀態

網球計分系統

tennis.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std 函式宣告 int fju string ball void score char ch int fpan void winner int a,i...