再次通过长达半小时的深思熟虑,对HandCard类系的重构是必然的,敏捷开发,就是得不停的提出想出更好的结构。下面咱们看下HandCard抽象类的实现:
java
package org.tunie.game.doudizhu.card; /** * <p>Title: HandCard.java</p> * <p>Description:一手牌 </p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月13日 * @version 1.0 */ public abstract class HandCard { private int type; private int score; private CardGroup cardGroup; public HandCard() { } public int getType() { return type; } protected void setType(int type) { this.type = type; } public int getScore() { return score; } protected void setScore(int score) { this.score = score; } public CardGroup getCardGroup() { return cardGroup; } protected void setCardGroup(CardGroup cardGroup) { this.cardGroup = cardGroup; setScore(cardGroup.getCard(0).getType()); } /** * 判断牌型 */ public final boolean judge(CardGroup cardGroup) { boolean result = false; if(determineConditions(cardGroup)) { result = judgeResult(cardGroup); if(result) { setCardGroup(cardGroup); } } return result; } /** * 判断条件 * @return */ protected abstract boolean determineConditions(CardGroup cardGroup); /** * 判断结果 * @return */ protected abstract boolean judgeResult(CardGroup cardGroup); }
这里不但将以前的judge重载方法出掉了,还引进了模板方法设计模式。这样优化后的好处就不说了,反正是好处多多,能够从下面列举的的几个类能够看出端倪。设计模式
Pairide
/** * <p>Title: Pair.java</p> * <p>Description: 对子</p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月15日 * @version 1.0 */ public class Pair extends HandCard{ public Pair() { setType(HandCardType.PAIR); } @Override protected boolean determineConditions(CardGroup cardGroup) { return determineConditions(cardGroup , 2); } protected boolean determineConditions(CardGroup cardGroup ,int size) { return cardGroup.size() == size; } @Override protected boolean judgeResult(CardGroup cardGroup) { return cardGroup.isSame(); } }
我在Pair这个类中,新增了一个determineConditions的重载方法,这样作主要是为了对Three,Bomb的扩展使用。测试
ThreePair
优化
/** * <p>Title: ThreePair.java</p> * <p>Description:三带对版型 </p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月16日 * @version 1.0 */ public class ThreePair extends HandCard { public ThreePair() { setType(HandCardType.THREE_PAIR); } @Override protected boolean determineConditions(CardGroup cardGroup) { return cardGroup.size() == 5; } @Override protected boolean judgeResult(CardGroup cardGroup) { cardGroup.doSort(CardGroupSortType.PAIR_PRECEDENCE); return cardGroup.subCardGroup(0, 3).isSame() && cardGroup.subCardGroup(3, 5).isSame(); } }
这个是刚才新增的类,是对三带对牌型的判断。this
下面就看下引发这一系列重构的元凶,Junko类
设计
/** * <p>Title: Junko.java</p> * <p>Description: 顺子</p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月16日 * @version 1.0 */ public class Junko extends HandCard { public Junko() { setType(HandCardType.JUNKO); } @Override protected boolean determineConditions(CardGroup cardGroup) { return cardGroup.size() > 5; } @Override protected boolean judgeResult(CardGroup cardGroup) { cardGroup.doSort(CardGroupSortType.DECREASE); boolean result = true; int score = cardGroup.getCard(0).getType(); for(int i = 1; i <cardGroup.size() ; i ++ , score --) { if(score != cardGroup.getCard(i).getType()){ result = false; break; } } return result; } }
这也是个尚未进行测试的类,很差意思。code