Давайте оставим пример простым и придерживаемся вашего первоначального подхода.
Сначала я бы представил общий интерфейс, описывающий все виды насекомых:
interface Insect {
boolean fly();
boolean walk();
boolean sound();
}
Методы fly
,walk
, sound
представляют возможные взаимодействия между насекомым и его окружением (в зависимости от характера этих взаимодействий методы могут быть разными и более сложными: возвращать сложные ответы, принимать обратные вызовы и т. Д.).
Ваша первая бабочка была бы просто конкретной реализацией интерфейса:
class Butterfly implements Insect {
boolean fly() { return true; }
boolean walk() { return true; }
boolean sound() { return false; }
}
Теперь давайте добавим возможность преобразования.Опять же, в общем, есть разные способы сделать это, поэтому давайте придерживаться примера бабочки.
Допустим, мы хотим, чтобы гусеница и связанная с ней бабочка были единым целым (мы не хотим, чтобы гусеница все еще бродила, когда бабочка уже существует).
В этом случаеЯ представлял бы и гусеницу, и бабочку как один класс и скрывал бы его текущее состояние в нем.И «состояние гусеницы», и «состояние бабочки» будут содержать различные реализации действий, которые должны измениться после преобразования.Вмещающий экземпляр делегирует свои методы текущему состоянию.
class Butterfly implements Insect {
private Insect state = new CaterpillarState();
boolean fly() { return state.fly(); }
boolean walk() { return state.walk(); }
boolean sound() { return state.sound(); }
void transform() { state = new ButterflyState(); }
private class ButterflyState implements Insect {
boolean fly() { return true; }
boolean walk() { return true; }
boolean sound() { return false; }
}
private class CaterpillarState implements Insect {
boolean fly() { return false; }
boolean walk() { return true; }
boolean sound() { return true; }
}
}
Метод transform
представляет триггер для метаморфозы.
Здесь ButterflyState
и CaterpillarState
реализуют то же самое Insect
интерфейс как внешний класс.В общем случае я бы определил другой интерфейс для внутренних состояний.