Я пытаюсь построить класс, который может занимать три состояния. В этих трех состояниях объект будет действовать совершенно по-другому. Я не могу просто создать три класса для этого, потому что объекты будут переходить между состояниями, и я не контролирую, как класс инициализируется. Все эти три состояния должны работать в соответствии с одним определением класса.
Теперь по состоянию тока, чтобы осуществить это, я сделаю следующее
enum ServerType {
primary,
backup,
idle
}
class ImportantClass {
State myState;
// Other fields
void commonClassFunc() {
if (state == idle) {
idleFoo();
} else if (state == primary) {
primaryFoo();
}
....
}
// Helper functions for State primary
void primaryFoo() {
// Access and mutate fields
}
...
// Helper functions for State backup
void backupFoo() {
// Access and mutate fields
}
...
// Helper functions for State idle
void idleBar() {
// Access and mutate fields
}
...
}
Вы можете видеть, как это приведет к очень большому Определение класса и его состояние c будут разделены только комментариями.
Моя цель - сделать это более красноречивым способом. Я мог бы, например, создать классы Primary, Backup и Idle и сделать так, чтобы ImportantClass содержал один из этих классов, однако не позволил бы этим методам получить доступ к общим полям. Я хотел использовать интерфейсы, которые позволяют мне делать как class ImportantClass implements Primary {}
, но, к сожалению, даже несмотря на то, что я могу определить метод primaryFoo в этом интерфейсе, этот метод все равно не сможет получить доступ к полям ImportantClass.
Делаете ли вы знаете, как я могу структурировать этот код так, чтобы я мог прекратить поведение этих трех состояний, между которыми важныйClass переключается при доступе к полям ImportantClass?