В вашем случае у меня был бы объект Card
, который содержит свойство CardStatus
. Подтипы CardStatus
соответствуют предыдущим значениям перечисления. Поведение рефакторинга, которое зависит от текущего состояния , за исключением перехода состояния в подтипы CardStatus.
Переход состояния в вашем первом примере, IMO, должен оставаться внутри объекта Card
. Изменение состояния больше похоже на поведение вмещающей карты, чем объекта состояния. Что вы можете сделать, это сделать так, чтобы объекты CardStatus сообщали вам, в какое состояние переходить после события.
Грубый пример: (очевидно, есть еще много вариантов, которые можно использовать.)
API
interface ICardStatus {
ICardStatus NextStatus(Card card);
void DoStuff(Card card);
}
class Card {
ICardStatus Status = new NormalCardStatus();
void DoStuff() {
Status.DoStuff(this);
}
void ChangeStatus() {
Status = Status.NextStatus(this);
}
}
Статус реализации
class NormalCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
return new UnderwaterCardStatus();
}
void DoStuff(Card card) {
// ...
}
}
class UnderwaterCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
return new DeathStatus();
}
void DoStuff(Card card) {
// ...
}
}
class DeathCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
// ...
}
void DoStuff(Card card) {
throw new Exception("Cannot do anything while dead");
}
}