Как подойти к этой проблеме дизайна - PullRequest
3 голосов
/ 15 августа 2010

Сценарий

Один склад, поставщики и потребители.Один поставщик может производить только один тип материала.Один потребитель может также потреблять только один тип материала.Хранилище знает о поставщиках и потребителях, но ни один из них не знает друг о друге.

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

Ответы [ 3 ]

2 голосов
/ 15 августа 2010

Полагаю, вы хотите иметь класс Supplier и класс Consumer, которые реализуют дженерики, чтобы вы могли реализовать Supplier<Clothes> или Consumer<Food> или что-то еще в вашем классе Warehouse?

Вы можете попробовать что-то в этом роде.Я полагаю, это более вероятная реализация фабрики генериков.

public class Supplier<T>{
    //You might decide you need an actual constructor that does something
    public Supplier(){}

    public T supplyItem(){
        return new T();
    }
}

Потребитель может выглядеть так ...

public class Consumer<T>{

    private int consumeCount = 0;

    //You might decide you need an actual constructor that does something
    public Consumer(){}

    public void consumeItem(T item){
        consumeCount++;
    }

    public int consumeCount(){
        return consumeCount;
    }
}

И, наконец, ваш склад может включать что-то вроде ...

Supplier<Integer> integerSupplier = new Supplier<Integer>();
Consumer<Integer> integerConsumer = new Consumer<Integer>();
Integer i = integerSuppler.supplyItem();
integerConsumer.consumeItem(i);
integerConsumer.consumeItem(integerSupplier.supplyItem());
System.out.println(integerConsumer.consumeCount());

Который мы ожидаем напечатать "2".Вы также можете изменить свои методы потребления, чтобы взять экземпляр Object вместо T, и использовать instanceOf, чтобы либо справиться с этим, либо сказать: «Не могу потреблять это, не моя вещь».С некоторыми instanceOf вам следует быть осторожнее, поэтому, если вам не нужно быть таким надежным, я бы об этом не беспокоился.http://www.javapractices.com/topic/TopicAction.do?Id=31 имеет хорошее объяснение, почему.

РЕДАКТИРОВАТЬ: Может показаться, что Потребитель и Поставщик взаимодействуют друг с другом, особенно если у вас есть строка, как integerConsumer.consumeItem(integerSupplier.supplyItem());, но важно отметить,что Потребитель и Поставщик на самом деле не взаимодействуют друг с другом.Поставщик просто генерирует новый Объект, а Потребитель воспринимает это как аргумент.В то время как Склад знает о существовании Потребителя и Поставщика, Потребитель не знает о существовании Поставщика и наоборот.

0 голосов
/ 15 августа 2010

Склад

public enum ITEMTYPE //known and public
Map<ITEMTYPE, count> items
Map<Supplier, ITEMTYPE> suppliers

registerSupplier(Supplier)
addItems(Supplier, count)

registerConsumer(Consumer)
consumeItems(Consumer, count)

Поставщик

ITEMTYPE type
ITEMTYPE getType()

Потребитель

ITEMTYPE type
ITEMTYPE getType()

Способ его использования:

Warehouse w = new Warehouse()
Supplier s1 = new Supplier(ITEMTYPE pens)
w.registerSupplier(s1)
w.addItems(s1, 10) // Update the data structure in warehouse with validations

Consumer c1 = new Consumer(ITEMTYPE pens)
w.registerConsumer(c1)
w.consumeItems(c1, 5) // Update the data structure in warehouse with validations
0 голосов
/ 15 августа 2010

вы думали о 2-мерной матрице

  • Производитель
  • Потребитель

Содержимое матрицы определяет «материал», который они производят / потребляют, а также, если им разрешено иметь отношение.

Будет ли это работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...