Я уже довольно давно использую шаблон проектирования и называл его "Схема цепочки ответственности ", но теперь я понимаю, что есть различия, и, возможно, это нецелесообразно. Итак, мой вопрос: 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, String является пустой строкой, устанавливается флаг и т. Д.).
До сих пор я обычно называл это шаблоном «Цепочка ответственности», рассматривая проблему наследования от базового класса как деталь реализации. Однако сегодня я осознал важное отличие: объекты в цепочке не могут прерывать остальную часть цепочки. Реализация не может сказать «это неверно, и я могу гарантировать, что это будет неверно для любого условия» (примечание: короткие замыкания только на true
).
Итак, следует ли называть это чем-то другим, кроме схемы цепочки ответственности? Есть ли какие-либо проблемы или проблемы, которые я должен учитывать при использовании этого подхода вместо традиционного, когда экземпляры передают сообщение.