2015-01-14 3 views
0

Я сейчас занимаюсь курсом в области разработки программного обеспечения (я должен). У нас есть целая куча задач, которые требуют от нас использования шаблонов проектирования на Java. Обычно я просто разработчик PHP, поэтому у меня не так много навыков в Java, что может быть проблемой.Правильное использование составного рисунка

Конкретная проблема заключается в следующем: мы должны использовать составной шаблон для следующей задачи: создать математическую структуру для решения условий. Термин может быть Number (double) или «/», «-», которые соединяют два термина или «sin», который использует один термин.

Мне нужно создать диаграмму класса UML. Что это

enter image description here

Я не уверен, если это правильно. Два главных вопроса, которые я получил о моем классе диаграмме:

  1. Правильно ли использовать значение, и первое/второе для композитов, потому что они имеют только 1 или 2 Термины, или я должен сделать список с add и убедитесь, что в списке есть ровно 1/2 элемента?
  2. Должен ли я создать еще один интерфейс для композитных структур (Sin, Разделить, Вычесть)

Могу ли я делать это правильно, или же я следую за плохой/неправильный подход?

Спасибо

Бернд

+1

* Просто отметить * дизайн шаблона не просто связан с Java. Фактически, GoF использовал язык C++, чтобы проиллюстрировать их примеры. Шаблоны проектирования не являются языковыми. –

+0

Спасибо, я уже знал это. Но в этом курсе мы должны использовать Java – Strernd

+0

Это выглядит нормально для меня. Это нормально использовать первый/второй. Если у вас было больше операций, вы могли бы добавить базовые классы BinaryOperation и UnaryOperation. Я бы просто изменил термин на выражение. Для меня термин должен быть терминальным символом (http://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols). – woru

ответ

2

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

Второй вариант будет выглядеть примерно так:

interface Term { 
    double getValue(); 
} 

class Constant implements Term { 
    private double value; 
    public double getValue() { 
     return value; 
    } 
} 

class Divide implements Term { 
    private Term numerator; 
    private Term denominator; 
    public double getValue() { 
     return numerator.getValue()/denominator.getValue(); 
    } 
} 

Это, вероятно, самое близкое представление вашего UML. В этом случае нет никакого преимущества при моделировании детских терминов как List.

Другой вариант, который я упомянул (который я бы не рекомендовал), должен иметь классы и BinaryOperation, а затем определить и enum для операций. В этом случае перечисление операций будет содержать фактическую логику расчета. Я думаю, что это излишне сложно для ваших нужд, если у вас нет большого количества операций.

+0

Это как раз то, как моя реализация выглядит на Java. Итак, моя диаграмма представляет правильное использование составного шаблона? – Strernd

+0

Да. Хотя обратите внимание, что термин должен быть интерфейсом или абстрактным классом. Похоже, вы понимаете, как вы его моделировали. – sprinter

+0

Да, термин - это интерфейс. спасибо – Strernd

0

Извините, но это неправильная реализация составного шаблона. Если вы посмотрите на это, вы увидите, что у вас нет класса Composite (объект с добавлением, удалением и методом getChild) и что вы объединяете объекты Leaf, которые вы не должны делать.

Если вы хотите применить сложный шаблон к этой проблеме, вам нужно создать класс, который содержит различные операции для выполнения.

Итак, сначала создайте абстрактный класс под названием что-то вроде FrameworkItem. Это соответствует Компонент на схеме композитного рисунка. Из этого выведите другой класс под названием Term.Это ваш Composite и является совокупностью FrameworkItem. (Убедитесь, что он включает в себя методы добавления, удаления и getChild.) Наконец, выведите классы Leaf отдельно (Number, Sin, Subtract, Divide и т. Д.) С FrameworkItem, а также используя простое объединение, а не агрегат.

Имейте в виду, что вашему методу решения() метода Composite необходимо взять объект Leaf в качестве параметра, который сообщает ему, какой из его методов solve() его детей нужно вызвать.

Смежные вопросы