public abstract class SpecialPokerRegularSss implements Comparator<PokerHolderSss>{
public enum SpecialType{
TRIPLET_SEQUENCE(new SpecialPokerRegularSssTripletSequence()), // 三顺子
TRIPLET_SAME_COLOR(new SpecialPokerRegularSssTripletSameColor()), // 三同花
SIX_HALF(new SpecialPokerRegularSssSixHalf()), // 六对半
FIVE_PAIR_THREE_STRIP(new SpecialPokerRegularSssFivePairThreeStrip()), // 五对三条
FOUR_SET_TRIPLET_STRIP(new SpecialPokerRegularSssFourSetTripletStrip()), // 四套三条
ALL_SAME_COLOR(new SpecialPokerRegularSssAllSameColor()), // 凑一色
ALL_SMALL(new SpecialPokerRegularSssAllSmall()), // 全小
ALL_BIG(new SpecialPokerRegularSssAllBig()), //全大
THREE_POINTS_WORLD(new SpecialPokerRegularSssTripletPointsWorld()), // 三分天下
TRIPLET_SAME_COLOR_SEQUENCE(new SpecialPokerRegularSssTripletSameColorSequence()), //三同花顺
TWELVE_ROYALTY(new SpecialPokerRegularSssTwelveRoyalty()), // 十二皇族
A_DRAGON(new SpecialPokerRegularSssADragon()), // 一条龙
SUPERME_DRAGON(new SpecialPokerRegularSssSupermeDragon()); // 至尊清龙
private final SpecialPokerRegularSss specialPokerRegularSss;
private static final Map<Integer, SpecialType> SPECIAL_TYPE_MAP;
private SpecialType(SpecialPokerRegularSss specialPokerRegularSss) {
this.specialPokerRegularSss = specialPokerRegularSss;
}
public SpecialPokerRegularSss getSpecialPokerRegularSss() {
return specialPokerRegularSss;
}
static {
SPECIAL_TYPE_MAP = new HashMap<>(SpecialType.values().length);
for (final SpecialType item : SpecialType.values()) {
SpecialType.SPECIAL_TYPE_MAP.put(item.ordinal(), item);
}
}
public static SpecialPokerRegularSss getSpecialTypeFrom(Integer ordinal) {
return SpecialType.SPECIAL_TYPE_MAP.get(ordinal).getSpecialPokerRegularSss();
}
}
public static SpecialPokerRegularSss getSpecialPokerRegularsFrom(List<Poker> pokers) throws BizException {
return SpecialPokerRegularSss.getSpecialPokerRegularsFrom(pokers == null ? new Poker[0] : pokers.toArray(new Poker[pokers.size()]));
}
public SpecialPokerRegularSss() {
}
// 获取所有SpecialPokerRegularSss.class的抽象类的实现类 最后用canPlay()方法匹配响应的实现类
//因为是十三水的特殊牌型 ,所以从最大的至尊清青龙开始
public static SpecialPokerRegularSss getSpecialPokerRegularsFrom(Poker... pokers) throws BizException {pokers = pokers == null ? Poker.EMPTY_POKERS : pokers;
for(int index = SpecialType.values().length - 1; index >=0; index--){
SpecialPokerRegularSss specialPoker = SpecialType.getSpecialTypeFrom(index);
if(specialPoker != null && specialPoker.canPlay(pokers)){
return specialPoker;
}
}
return null;
}
@Override
public final boolean canPlay(Poker[] pokers) throws BizException {
final PokerHolderSss pokerHolderSss = new PokerHolderSss(pokers);
return this.canPlay(pokerHolderSss);
}
protected abstract boolean canPlay(PokerHolderSss pokerHolderSss);
}
实现类
举例,这是其中一个,每个都是这样实现,就能自动匹配到实现类的canPlay方法
class SpecialPokerRegularSssADragon extends SpecialPokerRegularSss { // 一条龙
@Override
protected boolean canPlay(PokerHolderSss pokerHolderSss) { // A ~ K
return pokerHolderSss.getValueCount() == pokerHolderSss.getPokerCount();
}
}