Принцип единой ответственности говорит, например, что класс 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
и запускает соответствующий код печати,Это кажется неправильным. - Шаблон посетителя.Проблема состоит в том, что интерфейс посетителя должен существовать на уровне Core со ссылками на классы на уровне Customized.Я хотел бы иметь возможность добавлять новые подклассы в слой Customized с изменением слоя Core.