Принцип единственной ответственности гласит, например, что класс Invoice
не должен содержать код для печати самого себя. Печать должна быть выделена в другой класс.
Но предположим, что у вас есть иерархия Invoice
классов на разных уровнях программного обеспечения:
namespace CoreLayer {
public class Invoice {
public virtual void Print() {
...
}
}
}
namespace CustomizedLayer {
public class LaborInvoice : Invoice {
public override void Print() {
...
}
}
public class AccountInvoice : Invoice {
public override void Print() {
...
}
}
}
Какие методы или шаблоны дизайна можно использовать для разделения ответственности за печать?
Идеи:
- Отдельный класс с большим оператором
if
, который проверяет каждый подклассInvoice
и запускает соответствующий код печати. Это кажется неправильным. - Образ посетителя. Проблема в том, что интерфейс посетителя должен существовать на основном уровне со ссылками на классы на пользовательском уровне. Я хотел бы иметь возможность добавлять новые подклассы в настраиваемый слой с изменением основного слоя.