2010-08-15 5 views
3

ScénarioComment aborder ce problème de conception

Un entrepôt, les fournisseurs et les consommateurs. Un fournisseur peut produire un seul type de substance. Un consommateur peut également consommer un seul type de substance. L'entrepôt connaît les fournisseurs et les consommateurs, mais aucun d'entre eux n'est au courant les uns des autres. Comment concevoir les interfaces pour tous les acteurs de ce scénario et les simuler à l'aide de génériques pour montrer comment l'entrepôt fonctionne avec plusieurs fournisseurs, consommateurs et différents types de produits.

+1

pour moi, c'est un peu difficile à dire sans un exemple concret de ce que le programme est censé faire. Intuitivement, je dirais que vous n'avez même pas besoin d'interfaces ou de génériques car les différences entre les objets peuvent être suffisamment caractérisées par des propriétés. – Nicolas78

+0

Je voulais mettre en œuvre en utilisant Generics et le programme devrait expliquer comment l'entrepôt de travail avec plusieurs fournisseurs et consommateurs et différents types d'étoffes, c'est la base du fonctionnement normal de l'entrepôt, le client et les fournisseurs dans la vie réelle. – Rachel

+0

Quels sont les cas d'utilisation décrivant les interactions entre eux? – Paolo

Répondre

2

Je suppose que vous voulez avoir une classe Supplier et une classe Consumer que la mise en œuvre des génériques afin que vous pourriez avoir à mettre en œuvre Supplier<Clothes> ou Consumer<Food> ou quelque chose d'autre dans votre classe Warehouse?

Vous pourriez essayer quelque chose dans ce sens. C'est plus probable que je mette en place une usine de génériques.

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

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

consommateurs pourrait ressembler ...

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

Et enfin, votre entrepôt pourrait inclure quelque chose comme ...

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()); 

Ce qui nous attendrions à imprimer "2" . Vous pouvez également modifier vos méthodes de consommation pour prendre une instance de Object au lieu de T et utiliser instanceOf pour traiter ou dire "Impossible de consommer cela, pas mon truc". Cependant, il y a certaines choses que vous devriez faire attention avec instanceOf, donc s'il n'est pas nécessaire d'être aussi robuste, je ne m'inquiéterais pas. http://www.javapractices.com/topic/TopicAction.do?Id=31 a une bonne explication de pourquoi.

EDIT: Il peut sembler que le Consommateur et le Fournisseur interagissent entre eux, notamment lorsque vous avez une ligne comme integerConsumer.consumeItem(integerSupplier.supplyItem());, mais il est important de noter que le Consommateur et le Fournisseur n'interagissent pas réellement entre eux. le fournisseur génère simplement un nouvel objet, et le consommateur le prend comme argument. Bien que Warehouse connaisse l'existence du consommateur et du fournisseur, le consommateur ne connaît pas l'existence du fournisseur et vice versa.

+1

La classe Warehouse ressemble plus à la méthode main(). – pavanlimo

+0

J'ai inclus cet extrait de code pour montrer comment 'Consumer' et' Warehouse' pourraient être invoqués. J'imagine que ce sera à Rachel de spécifier exactement ce qui est nécessaire dans l'entrepôt :) – JBirch

0

avez-vous pensé à une matrice 2 dimensions

  • Producteur
  • Consumer

Le contenu de la matrice définit les « trucs » qu'ils produisent/consomment et aussi si elles sont autorisées avoir une relation.

Est-ce que cela fonctionnerait?

0

Entrepôt

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

registerSupplier(Supplier) 
addItems(Supplier, count) 

registerConsumer(Consumer) 
consumeItems(Consumer, count) 

Fournisseur

ITEMTYPE type 
ITEMTYPE getType() 

Consumer

ITEMTYPE type 
ITEMTYPE getType() 

La façon de l'utiliser:

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 
Questions connexes