Step Builder パターンに興味があるかもしれません。提示されたすべてのケースに必ずしも適切に一致するとは限りませんが、各操作は、次の操作を実行できるインターフェイスを実装する何かを返すという考えです。正しい順序で操作を実行することによってのみオブジェクトを取得できるため、正しい順序で操作を実行する必要があります。
反復 (next/hasNext) の状況では少し強制的に感じるかもしれませんが、
パターン。どういうわけかCanWearSocks
、次のメソッドのみを持つインターフェイスのインスタンスを取得します。
CanWearShoes putOnSocks()
を呼び出すと、次のメソッドのみを持つインスタンスputOnSocks()
が取得されます。CanWearShoes
SockAndShoeWearer putOnShoes()
電話をかけるputOnShoes()
と、靴下と靴を履いているものがあり、正しい順序でそれを行う必要がありました。
特に素晴らしいのは、実際には両方のケースで同じオブジェクトを使用できることですが、メソッド シグネチャはインターフェイス タイプのみを返すため、コードはインターフェイス メソッドしか使用できません (コードが卑劣で、オブジェクトを型にキャストしない限り)。タイプが違う)。
例
これは、反復パターンを実装するかなり不自然な例です。つまり、NextGetter の前に NextChecker を使用するようにします。
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