В прошлом семестре я должен был разработать такую систему на Java как домашнее задание.Хотя требовалось, чтобы мы проверили руки, используя схему цепочки ответственности, я вполне уверен, что это был плохой подход к проблеме и в основном просто способ вставить шаблон в домашнюю работу.
Если бы у меня былочтобы переделать его без схемы цепочки ответственности и с использованием более разумного, более сплоченного списка стратегий, я бы использовал такой дизайн:
Был бы класс Card
с цветом(пики, трефы, бриллианты, червы) и число (оба enum
с);класс Hand
, который вмещает 5 карт (или просто n
карт, если вам это нравится);абстрактный класс HandRank
, который реализует интерфейс Comparable<HandRank>
, и подклассы для каждого вида рук (два вида, три вида, прямые и т. д.), каждый из которых сопоставим с другим (так что StraightFlush
лучшечем TwoOfAKind
);и базовый класс AbstractHandAnalyzer
.Этот AbstractHandAnalyzer
будет иметь метод Analyze(Hand)
, который будет возвращать объект HandRank
.
Теперь вы создаете один подкласс из AbstractHandAnalyzer
на HandRank
подкласс.Эти подклассы проверяют данную руку и возвращают экземпляр HandRank
, если рука совпадает (например, если TwoOfAKindAnalyzer
находит, что у вас есть два короля, он возвращает TwoOfAKindRank
, который сообщает, что он нашел двух королей, и сохраняет кикера весли это понадобится во время сравнения позже).
Все, что вам нужно сделать, чтобы проанализировать руку, - это иметь список анализаторов рук в порядке убывания (поэтому вы начинаете со стрит-флеша), изапускайте каждый анализатор на руке до тех пор, пока один из них не совпадет, не возвращая null
.
Важной частью здесь является отсоединение покерных рук от самих рангов.В большинстве языков (хотя это может и не быть в случае Smalltalk), если вы создаете объект Hand
, вы не можете волшебным образом превратить его в другой класс, поэтому создание подклассов Hand
для определения рангов может быть затруднено в зависимости от того, какой экземпляр вы создали.схема, и может быть сделана практически невозможной, если рука изменчива (некоторые варианты покера позволяют менять карты).Такой подход позволяет повторно использовать Hand
и легко применять различные анализаторы для рук.