Я уже давно использую шаблон проектирования и называю / называю его « Шаблон цепочки ответственности », но теперь я понимаю, что есть различия, и это может и не произойти подойдет для этого. Итак, мой вопрос 1: «Является ли следующий образец этой модели, или его следует назвать как-нибудь еще?», И 2, «есть ли причина, по которой я предпочитаю традиционный способ?».
Я часто использую следующую схему при разработке программного обеспечения. У меня есть интерфейс, который определяет функтор , что-то вроде этого.
interface FooBar{
boolean isFooBar( Object o );
}
Обычно это классы поиска, фильтрации или обработки; обычно что-то вроде Comparator . Способ реализации обычно является функциональным (то есть без побочных эффектов). В конце концов, я создаю реализацию интерфейса, которая выглядит следующим образом:
class FooBarChain implements FooBar{
FooBar[] foobars;
FooBarChain( FooBar... fubars ){
foobars = fubars;
}
boolean isFooBar( Object o ){
for( FooBar f : foobars )
if( f.isFooBar( o ) )
return true;
return false;
}
}
Это также не всегда логическое значение - я также использовал этот шаблон с изменяемыми объектами - но всегда есть условие короткого замыкания (например, возвращает истину, строка является пустой строкой, устанавливается флаг и т. Д.).
До сих пор я обычно называл это шаблоном "Цепочка ответственности", рассматривая вопрос наследования от базового класса как деталь реализации. Однако сегодня я осознал важное различие: объекты вдоль цепи не могут прерывать остальную часть цепи. Реализация не может сказать «это ложно, и я могу гарантировать, что оно будет ложным для любого условия» (примечание: короткое замыкание только на true
).
Итак, следует ли это назвать чем-то иным, нежели образцом цепочки ответственности? Есть ли какие-либо проблемы или проблемы, которые я должен учитывать при использовании этого подхода по сравнению с традиционным, когда экземпляры передают сообщение.