Ответ 1
Вам может быть интересен Шаблон построителя шагов. Это не обязательно хорошее соответствие для всех случаев, которые вы представили, но идея состоит в том, что каждая операция возвращает что-то, реализующее интерфейс, который позволяет выполнить следующую операцию. Поскольку вы можете получить объекты только путем выполнения операций в правильном порядке, вы будете вынуждены выполнять их в правильном порядке.
В то время как в случае итерации (next/hasNext) она будет немного зависеть, вы можете представить ее для
- наденьте носки,
- затем наденьте обувь
шаблон. Как-то вы получаете экземпляр интерфейса CanWearSocks
, который имеет только следующий метод.
CanWearShoes putOnSocks()
Когда вы вызываете putOnSocks()
, вы получаете свой экземпляр CanWearShoes
, который имеет только следующий метод.
SockAndShoeWearer putOnShoes()
Когда вы звоните putOnShoes()
, у вас теперь есть что-то носки и обувь, и вы были вынуждены сделать это в правильном порядке.
Что особенно приятно, так это то, что вы можете использовать один и тот же объект в обоих случаях, но поскольку сигнатуры метода возвращают только тип интерфейса, код сможет использовать только методы интерфейса (если код не скрыт и не выполняет объект другого типа).
Пример
Вот довольно надуманный пример, который реализует шаблон итерации, т.е. гарантирует, что вы используете NextChecker перед NextGetter.
public class StepBuilderIteration {
interface NextChecker {
NextGetter hasNext();
}
interface NextGetter {
Object next();
NextChecker more();
}
static class ArrayExample {
final static Integer[] ints = new Integer[] { 1, 2, 3, 4 };
public static NextChecker iterate() {
return iterate( 0 );
}
private static NextChecker iterate( final int i ) {
return new NextChecker() {
public NextGetter hasNext() {
if ( i < ints.length ) {
return new NextGetter() {
public Object next() {
return ints[i];
}
public NextChecker more() {
return iterate( i+1 );
}
};
}
else {
return null;
}
}
};
}
}
public static void main(String[] args) {
NextChecker nc = ArrayExample.iterate();
while (nc != null) {
NextGetter ng = nc.hasNext();
if (ng != null) {
System.out.println(ng.next());
nc = ng.more();
}
}
}
}
Вывод:
1
2
3
4