005 关于HandCard的重构

    再次通过长达半小时的深思熟虑,对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

相关文章
相关标签/搜索