2016-07-01 4 views
-2

Я новичок в дизайне. Может ли кто-нибудь помочь мне определить, какой шаблон дизайна можно использовать здесь? сообщите пожалуйста.Какой шаблон дизайна можно использовать здесь?

Предположим, что мы хотели бы смоделировать персональный компьютер (ПК). ПК состоит из шкафа, который включает в себя шасси. В свою очередь шасси состоит из шины, флоппи-дисковода, блока памяти, процессора и источника питания. Автобус включает сетевую карту. Мы хотели бы обработать все компоненты оборудования единообразно. Основные операции: netPrice и powerConsumption, которые возвращают чистую цену и энергопотребление каждого компонента соответственно. Кроме того, каждый компонент может иметь свою собственную специфическую семантику.

+5

Звучит как домашнее задание. Вы сами думали? Можете ли вы поделиться ими здесь? – messy

+0

Да. Я считаю, что это создание, поскольку мы хотим создать новый объект для ПК, но у меня есть сомнения, что он может быть структурным и потому, что в нем есть группа объектов. –

+0

звучит как использование интерфейса - это путь. IPCComponent предоставляет методы GetNetPrice() и GetPowerConsumption(), код, лежащий в основе этих методов, может быть совершенно уникальным между классами (компонентами). – Fredrik

ответ

3

Два основных шаблона проектирования, которые я бы предложил, - это модели 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 вместо этого.

Примечание: вы не указали, на каком языке вам это нужно, поэтому примеры кода являются псевдокодом. Я предполагаю, что вы будете использовать какой-то объектно-ориентированный язык, поддерживающий такие вещи, как интерфейсы и абстракции и прочее.

+0

Привет @Gordon, не могли бы вы объяснить, почему вы просто не использовали командный шаблон? – guijob

+0

@ J.Guilherme вы можете объяснить, почему вы считаете, что это было бы уместно? – Gordon

+0

Поскольку этот шаблон скроет всю спецификацию каждого оборудования, отображающего только netPrice и powerConsumption, которые будут реализованы с использованием интерфейса, например: – guijob

0

Вы можете использовать Command Pattern для того, чтобы скрыть спецификации для каждого оборудования, выставляя только те методы, которые хотите использовать шасси.

Для этого необходимо создать интерфейс, как:

public interface Command { 
    public void execute(); 
} 

Затем вы создаете класс для каждого метода вы хотите шасси использовать для каждого оборудования, например, netPrice():

public class NetPriceCommand : Command { 
    private Equipment equipment; 

    public NetPriceCommand(Equipment equipment) { 
     this.equipment = equipment; 
    } 

    public void execute() { 
     this.equipment.netPrice(); 
    } 
} 

Теперь, когда вы хотите использовать метод newPrice для HD, вы создадите экземпляр NetPriceCommand с HD в конструкторе, а затем с помощью метода execute.

Надеюсь, это поможет.