Quel est le modèle le plus utilisé dans java.io?

On m’a posé cette question récemment lors de mon entretien d’embauche et je n’ai pas pu y répondre. Alors, quel est le motif le plus utilisé dans java.io et comment est-il utilisé? Quels sont les autres modèles utilisés dans les bibliothèques Java communes?

Je suppose qu’ils voulaient entendre parler du motif de décorateur que l’on peut trouver dans les différents Streams, Readers and Writers.

Autres motifs (petite sélection):

  • Modèle d’observateur dans les bibliothèques de balançoires
  • Modèle d’usine dans les packages javax.xml.parsers
  • Motif Itérateur utilisé dans les collections

Je suis presque sûr que l’on peut trouver des exemples pour presque tous les modèles énumérés sur cette page wikipedia du SDK Java.

BufferedReader etc. implémente un motif décoratif . N’importe quel Reader , par exemple FileReader ou SsortingngReader , peut être décoré avec la fonction de mise en mémoire tampon, qui est vraiment source de mémoire.


D’autres modèles

  • java.util.Comparator est un modèle de stratégie

Anti-modèles

Pour append à ce que d’autres ont dit, il existe plusieurs anti- motifs dans les bibliothèques Java:

Antipattern: inheritance au lieu de composition

From Effective Java 2nd Edition, Item 16: Favoriser la composition par rapport à l’inheritance :

Il existe un certain nombre de violations évidentes de ce principe dans les bibliothèques de la plate-forme Java. Par exemple, une stack n’est pas un vecteur, Stack ne doit donc pas étendre Vector . De même, une liste de propriétés n’est pas une table de hachage, de sorte que les Properties ne doivent pas étendre Hashtable . Dans les deux cas, la composition aurait été préférable.

Questions connexes

  • Préfère la composition à l’inheritance?
  • inheritance java versus composition (implémentation d’une stack)
  • Différence entre l’inheritance et la composition
  • Héritage ou composition: S’appuyer sur «is-a» et «has-a»?
  • Meilleures pratiques orientées object – Héritage v Composition v Interfaces
  • Devrais-je utiliser l’inheritance ou la composition?
  • Héritage ou agrégation
  • Agrégation vers Composition
  • Motif de décorateur utilisant la composition au lieu de l’inheritance

Antipattern: interfaces constantes

From Effective Java 2nd Edition, Rubrique 19: Utiliser les interfaces uniquement pour définir les types :

Il existe plusieurs interfaces constantes dans les bibliothèques de la plate-forme Java, telles que java.io.ObjectStreamConstants . Ces interfaces doivent être considérées comme des anomalies et ne doivent pas être émulées.

Questions connexes

  • Une classe doit-elle implémenter une interface de constantes uniquement?
  • Quel est le meilleur moyen d’implémenter des constantes en Java?

Antipattern: constructeur télescopique et modèles JavaBeans

De Effective Java 2nd Edition, Item 2: Envisagez un générateur face à de nombreux parameters de constructeur ( extrait en ligne ):

Traditionnellement, les programmeurs utilisaient le modèle de constructeur télescopique , dans lequel vous fournissez à un constructeur uniquement les parameters requirejs, un autre avec un seul paramètre facultatif, un troisième avec deux parameters facultatifs, etc. […] Le modèle de constructeur télescopique fonctionne, mais il est difficile d’écrire du code client quand il y a beaucoup de parameters, et encore plus difficile de l’écrire.

Une autre alternative lorsque vous êtes confronté à de nombreux parameters de constructeur est le modèle JavaBeans , dans lequel vous appelez un constructeur sans paramètre pour créer l’object, puis appelez des méthodes de définition pour définir chaque paramètre requirejs et chaque paramètre facultatif présentant un intérêt. […] Malheureusement, le modèle JavaBeans présente des inconvénients sérieux. […] un JavaBean peut être dans un état incohérent en cours de construction [et] il exclut la possibilité de rendre une classe immuable.

Bloch recommande d’utiliser plutôt un modèle de générateur .

Questions connexes

  • Est-ce un motif de conception bien connu? Quel est son nom?
  • Quelle est la différence entre le modèle de conception de générateur et le modèle de conception d’usine?
  • Quand utiliseriez-vous le modèle de générateur?

Le modèle de décorateur est souvent utilisé dans java i / o.

Exemple

 BufferedReader br = new BufferedReader(new FileReader("filename.txt")); 

Motif de décorateur, je pense. Pour créer toutes les variantes de lecteurs, enregistreurs, stream d’entrée et de sortie. Voir ceci , par exemple.

Modèles utilisés dans le package java.io.

  1. Decorator_pattern .

    Exemples:

    La classe abstraite java.io.FilterInputStream et ses sous-classes concrètes: BufferedInputStream, CheckedInputStream etc.

  2. Motifs Abstract_factory_pattern et Factory_method_pattern :

    Exemples:

    La classe abstraite InputStream et ses sous-classes concrètes: ByteArrayInputStream, FileInputStream, FilterInputStream etc.

     InputStream input = new FileInputStream("some_file.txt"); 

    Les classes ci-dessous permettent une unification des entrées d’un tableau d’octets, d’un fichier, d’une connexion réseau, d’un stockage persistant, d’un tube, d’une chaîne, etc.:

     class java.io.InputStream class java.io.ByteArrayInputStream class java.io.FileInputStream class java.io.FilterInputStream class java.io.ObjectInputStream class java.io.PipedInputStream class java.io.SequenceInputStream class java.io.SsortingngBufferInputStream 
  3. Adapter_pattern :

    Exemples:

    java.io.InputStreamReader traduit un stream d’octets en un stream de caractères, et un java.io.OutputStreamWriter convertit un stream de caractères en un stream d’octets.

    Vous pouvez trouver plus de détails dans cet article

  4. Template_method_pattern (source: article journaldev )

    Toutes les méthodes non abstraites de java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer .

Pour tous les autres modèles de Java, reportez-vous à ce post:

Exemples de modèles de conception GoF dans les bibliothèques principales de Java