Два основных шаблона проектирования, которые я бы предложил, - это модели Builder и Composite.
Внедрение двух интерфейсов: NetPrice
и PowerConsumption
.
- в
NetPrice
, добавьте метод getNetPrice
- в
PowerConsumption
, добавьте метод getPowerConsumption
Если все компоненты требуют эти два метода, рассмотреть вопрос о добавлении абстрактную ComponentType
реализации этих двух интерфейсов. Извлеките все остальные компоненты из этого ComponentType
. Это позволит вам реализовать каждый подкласс с их собственной спецификой, отображаемой через один и тот же интерфейс.
Для сборки PC
, я бы предложил изучить шаблон Builder, например. создать класс с выделенными методами для сборки компьютера, например. то, что позволит вам написать код, такой как
PCBuilder builder = new PCBuilder();
PC pc = builder
.cabinet(new Cabinet())
.chassis(new Chassis))
.cpu(new Intel())
.andSoOn()
.assemble();
Это идеальное решение для того, чтобы связать вещи вместе.
Я предполагаю, что вы хотите получить общую чистую цену и энергопотребление для ПК, поэтому им нужно реализовать те же два интерфейса, которые мы определили в начале. Это будет Композитный шаблон, то, например. ПК будет делать
public double getNetPrice() {
double sum = 0;
foreach (this.components as component) {
sum += component.getNetPrice();
}
return sum;
}
Сделайте то же самое для компонентов, имеющих другие компоненты, например. если у вашего Bus
есть NetworkCard
, getNetPrice
на автобусе получит чистую цену сетевой карты и добавит ее к тому, что может стоить автобус. То же самое для getPowerConsumption
очевидно.
Компоненты, не имеющие других компонентов (листья в составном дереве), просто возвращают свои соответствующие значения, например. Ваш NetworkCard
просто
public double getNetPrice() {
return 42.0;
}
Если вы хотите, чтобы напечатать чистые цены и потребление энергии по отдельности, имеют вид на Visitor pattern вместо этого.
Примечание: вы не указали, на каком языке вам это нужно, поэтому примеры кода являются псевдокодом. Я предполагаю, что вы будете использовать какой-то объектно-ориентированный язык, поддерживающий такие вещи, как интерфейсы и абстракции и прочее.
Звучит как домашнее задание. Вы сами думали? Можете ли вы поделиться ими здесь? – messy
Да. Я считаю, что это создание, поскольку мы хотим создать новый объект для ПК, но у меня есть сомнения, что он может быть структурным и потому, что в нем есть группа объектов. –
звучит как использование интерфейса - это путь. IPCComponent предоставляет методы GetNetPrice() и GetPowerConsumption(), код, лежащий в основе этих методов, может быть совершенно уникальным между классами (компонентами). – Fredrik