Это альтернативный способ написания того же.
Я думаю, что это шаблон посетителя, хотя я все время видел его, я не совсем понимаю (документация посетителя), так что, вероятно, это что-то другое.
В любом случае, идея состоит в том, чтобы использовать анонимные внутренние классы (поддельные Java "замыкания" ) и написать итерацию один раз.
public class IterationSample {
public static void main( String [] args ) {
Foo [] items = new Foo[0]; // get it from somewhere ....
iterate( items , new _(){void with( Foo f ){
f.doSomething();
}});
iterate( items , new _(){void with( Foo f ){
f.doSomethingElse();
}});
iterate( items , new _(){void with( Foo f ){
f.doBar();
}});
}
// write the loop once.
static void iterate( Foo [] items, _ visitor ) {
for( Foo f : items ) {
visitor.with( f );
}
}
}
Объект Foo будет объектом, который будет вашим объектом.
// Not really abstract just for the sake of the sample. Use your own.
abstract class Foo {
abstract void doSomething();
abstract void doSomethingElse();
abstract void doBar();
}
Наконец-то это «посетитель»
// made abstract instead of interface just to avoid having to type
// "public" each time.
abstract class _ {
abstract void with( Foo f );
}
Жаль, что я не могу избежать возвращаемого типа метода.
В противном случае это
iterate( items ,new _(){ with( Foo f ){
будет читаться как:
Повторять элементы "шум" с помощью foo
Зачем вам это делать, когда вы можете сделать это ?
Потому что таким образом вы можете иметь массив операций:
_ [] operations = {
new _(){void with( Foo f ){
f.doSomething();
}},
new _(){void with( Foo f ){
f.doSomethingElse();
}},
new _(){void with( Foo f ){
f.doBar();
}}
};
И повторять их :)
for( _ andPerformAction : operations ) {
iterate( items , andPerformAction );
}
Могут быть некоторые ситуации для этого, хотя я могу думать о любой прямо сейчас = -S