如何处理这个设计问题

时间:2010-08-15 16:38:43

标签: java architecture

方案

一个仓库,供应商和消费者。一个供应商只能生产一种类型的东西。一个消费者也可以只消费一种类型的东西。仓库了解供应商和消费者,但他们都不了解彼此。

如何为此场景中的所有角色设计界面,并使用泛型来模拟它,以演示仓库如何与多个供应商,消费者和不同类型的东西一起工作。

3 个答案:

答案 0 :(得分:2)

我想您希望拥有一个Supplier类和一个Consumer类来实现泛型,以便您可以在Supplier<Clothes>Consumer<Food>或其他内容中实现{ {1}}上课?

您可以尝试一下这方面的内容。我想这更有可能实施仿制药工厂。

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;
    }
}

我们希望打印“2”。您也可以更改您的消费方法,以取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()); 而不是Object的实例,并使用T来处理它或说“不能消耗它,而不是我的东西。 “有些事情你应该注意instanceOf,所以如果它不是那么强大我不会担心它。 http://www.javapractices.com/topic/TopicAction.do?Id=31对原因有很好的解释。

编辑:消费者和供应商可能看起来像彼此互动,特别是当你有像instanceOf这样的行时,但重要的是要注意消费者和供应商实际上并没有互相交流那里。供应商只是生成一个新的对象,消费者将其作为一个参数。虽然Warehouse知道消费者和供应商的存在,但消费者并不知道供应商的存在,反之亦然。

答案 1 :(得分:0)

你想到了一个二维矩阵

  • 生产者
  • 消费

矩阵的内容定义了它们产生/消费的“东西”,以及它们是否允许有关系。

那会有用吗?

答案 2 :(得分:0)

仓库

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