2012-04-04 1 views
1

Какая версия для розничного магазина? например Компания продает товары из магазинов.Иерархия объекта

Компания может иметь много магазинов и продавать много продуктов. Продукты не обязательно привязаны к каждому магазину, или я бы так подумал.

У меня есть базовое задание, в котором спрашивается, что я проектирую систему, которая рассчитывает количество хозяйственного заказа продукта. Мы должны реализовать структуру, которая будет подходящей для последующего присвоения (для которого у нас нет никаких подробностей ..), и рекомендуется структура выглядит следующим образом:

public class Company { 
    private Store store; 

    public static void main(String[] args) 
    { 
     Store storeOne = new Store(); 

     storeOne.setEOQRelevantValues(1, etc..); 
    } 
} 

public class Store { 
    private Product product; 

    //.. 

    public setEOQRelevantValues(int eoqRelevantValues) 
    { 
     Product.setEOQRelevantValues(eoqRelevantValues); 
    } 
} 

public class Product{ 
    private int eoqRelevantValues; 

    //.. 

    public setEOQRelevantValues(int eoqRelevantValues) 
    { 
     this.eoqRelevantValues = eoqRelevantValues; 
    } 

    public int calculateEOQ() 
    { 
     //do stuff with this.eoqRelevantValues.. 
     return EOQ; 
    } 
} 

Это, кажется, нарушает все мало I знать о ООП. Методы, которые передают данные вниз по иерархии - дублирование параметров между объектами? Что мне не хватает?

+0

Это выглядит как * провалил * установка Состав, и, безусловно, не правильный полезной настройки объекта-графа. Я не понимаю, почему «продукт [должен быть] Store» или «Store [должен быть] Продуктом», например. Это действительно * то, что было показано/предложено? –

+0

@pst - да, следующее задание потребует нескольких магазинов и продуктов под этими магазинами. – tkf144

ответ

2

Вы правильно относитесь к тому, что было бы необычно инициализировать иерархию объектов, передавая все параметры сверху вниз.

Ваш лектор может быть намеком на то, что вы реализуете что-то вдоль линий Composite, при этом каждый класс в иерархии имеет общий метод (например, getValue()). В случае Product (то есть листового узла) это просто возвращает значение продукта, тогда как в случае Store или Company оно будет перебирать составляющую Product с (или Store с), вызывая getValue() и суммируя результат.

Ключевое различие между этим и тем, что вы написали выше, состоит в том, что вы обычно инициализируете каждый Product отдельно через свой конструктор, а не путем передачи данных из другого объекта. Если продукт неизменен, вы можете пометить его поля как final. Затем вы можете добавить методы утилиты другим классам в иерархии (например, moveProduct(Store store1, Store store1)); Другими словами, другие классы затем проявили бы поведение, а не просто «контейнеры данных».

Пример

/** 
* Optional interface for uniting anything that can be valued. 
*/ 
public interface Valuable { 
    double getValue(); 
} 

/** 
* Company definition. A company's value is assessed by summing 
* the value of each of its constituent Stores. 
*/ 
public class Company implements Valuable { 
    private final Set<Store> stores = new HashSet<Store>(); 

    public void addStore(Store store) { 
    this.stores.add(store); 
    } 

    public void removeStore(Store store) { 
    this.stores.remove(store); 
    } 

    public double getValue() { 
    double ret = 0.0; 

    for (Store store : stores) { 
     ret += store.getValue(); 
    } 

    return ret; 
    } 
} 

/** 
* Store definition. A store's value is the sum of the Products contained within it. 
*/ 
public class Store implements Valuable { 
    private final List<Product> products = new LinkedList<Product>(); 

    public void addProduct(Product product) { 
    this.products.add(product); 
    } 

    public void removeProduct(Product product) { 
    this.products.remove(product); 
    } 

    public double getValue() { 
    double ret = 0.0; 

    for (Product product : products) { 
     ret += product.getValue(); 
    } 

    return ret; 
    } 
} 

/** 
* Product definition. A product has a fixed inherent value. However, you could 
* always model a product to depreciate in value over time based on a shelf-life, etc. 
* In this case you might wish to change the Valuable interface to accept a parameter; 
* e.g. depreciationStrategy. 
*/ 
public class Product implements Valuable { 
    private final double value; 

    public Product(double value) { 
    this.value = value; 
    } 

    public double getValue() { 
    return value; 
    } 
} 
+0

Благодарим за отзыв. Я прочитал образец Composite, но на этом этапе он немного выше меня, и я изо всех сил пытаюсь понять, что вы имеете в виду. Есть ли вероятность, что вы могли бы предоставить краткий образец кода? :) Спасибо – tkf144

+0

@Thomas: Пример добавлен. – Adamski