把网球计分招式重构到状态模式
刚刚把网球计分招式重构到状态模式。
过程:
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持有的新的状态