Patron Objet Nul

Dans le patron d'objet nul, un objet nul remplace la vérification des instances d'objet NULL. Au lieu de vérifier les valeurs nulles, l'objet nul répond par une relation qui ne fait rien. Un tel objet nul peut également fournir un comportement par défaut lorsque les données ne sont pas disponibles.

Dans le patron de conception Objet nul, nous créons une classe abstraite qui spécifie diverses opérations à effectuer et des classes d'entités qui étendent cette classe, et nous créons également une classe objet nul qui n'implémente rien pour la classe. Cette classe objet nul est utilisée de manière transparente dans les endroits où des vérifications de nullité sont nécessaires.


summary

intention

Utilisez un objet nul au lieu d'une valeur nulle. L'objet nul implémente la même interface, mais n'effectue aucune opération ou fournit des opérations par défaut pour les requêtes.

Principaux problèmes résolus

  • Le patron de conception Objet nul résout les problèmes pouvant découler de l'utilisation de valeurs nulles dans un système, tels que les exceptions NullPointerException.
  • Il permet au système de continuer à fonctionner avec un objet nul « sûr » lorsqu'aucun objet approprié n'est disponible, plutôt que d'échouer.

Cas d'utilisation

  • Lorsque le système doit gérer des objets nuls, mais souhaite également éviter les vérifications de nullité ou la gestion des valeurs nulles.

Approche d'implémentation

  • Définir le protocole:Définir un protocole ou une interface qui spécifie les comportements à implémenter.
  • Création d'objets concrets:Des objets concrets qui implémentent le protocole et fournissent le comportement réel.
  • Créer un objet nul:Implémenter également le même protocole, mais fournir une implémentation « vide », c'est-à-dire qu'aucune opération significative n'est effectuée.

Code clé

  • Protocole ou interface:Spécifie les méthodes que l'objet doit implémenter.
  • Objet concret:Implémente le protocole et contient la logique métier réelle.
  • Objet nul:Implémente le protocole, mais les implémentations de méthodes sont vides ou des comportements par défaut.

Exemple d'application

  • Système de journalisation:Dans un système de journalisation, un objet nul peut représenter un journaliseur qui n'effectue aucune opération.
  • Utilisateur par défaut:Dans un système, s'il n'y a actuellement aucun utilisateur, un objet utilisateur vide peut être utilisé à la place de null.

Avantages

  1. Éviter les vérifications de null:Élimine les vérifications de null dans le code.
  2. Simplification du code client:Les clients peuvent appeler directement les méthodes, que l'objet soit null ou non.
  3. Extensibilité:L'ajout de nouveaux objets concrets est transparent pour les clients, sans nécessiter de modification du code existant.

Inconvénients

  • Peut masquer des erreurs:L'utilisation d'objets null peut masquer des erreurs ou des conditions exceptionnelles, rendant le débogage difficile.
  • Augmente la complexité de la conception:Un objet null doit être implémenté pour chaque interface susceptible de renvoyer null.

Suggestions d'utilisation

  • Lorsque le système doit gérer des valeurs null, mais souhaite aussi simplifier la gestion des erreurs et éviter les vérifications de null, envisagez d'utiliser le patron Null Object.

Notes

  • Le patron Null Object doit être utilisé avec prudence afin de s'assurer qu'il ne masque pas les erreurs ni l'état réel du système.
  • Un objet null doit fournir la même interface que les objets concrets, afin que le code client puisse l'utiliser sans aucune modification.

Structure

Le patron Null Object comprend les principaux rôles suivants:

  • AbstractionObject(Objet abstrait):Définit l'interface attendue par le client. Cette interface peut être une classe abstraite ou une interface.

  • Objet concret(Objet concret):Classes concrètes qui implémentent l'interface d'objet abstrait. Ces classes fournissent un comportement réel.

  • Objet nul: Une classe d'objet nul qui implémente l'interface d'objet abstraite. Cette classe fournit un comportement par défaut sans effet à utiliser lorsque l'objet est indisponible ou non applicable. Elle peut servir de substitut aux objets concrets, en remplaçant les vérifications de null dans le code client.

Implémentation

Nous allons en créer une qui définit des opérations (ici, le nom du client) ...AbstractCustomerClasse abstraite, et étenduAbstractCustomerles classes d'entité de la classe. Classe de fabriqueCustomerFactoryEn fonction du nom passé par le client, retournezRealCustomerouNullCustomerObjet.

NullPatternDemo, notre classe de démonstration utiliseCustomerFactorypour démontrer l'utilisation du patron Null Object.

空对象模式的 UML 图

Étape 1

Créez une classe abstraite.

AbstractCustomer.java

public abstract class AbstractCustomer { protected String name; public abstract boolean isNil(); public abstract String getName(); }

Étape 2

Créez des classes d'entité qui étendent la classe ci-dessus.

RealCustomer.java

public class RealCustomer extends AbstractCustomer { public RealCustomer(String name) { this.name = name; } @Override public String getName() { return name; } @Override public boolean isNil() { return false; } }

NullCustomer.java

public class NullCustomer extends AbstractCustomer { @Override public String getName() { return "Non disponible dans la base de données client"; } @Override public boolean isNil() { return vrai; } }

Étape 3

CréerCustomerFactoryclasse.

CustomerFactory.java

public class CustomerFactory { public static final String[] names = {"Rob", "Joe", "Julie"}; public static AbstractCustomer getCustomer(String name){ for (int i = 0; i < names.length; i++) { if (names[i].equalsIgnoreCase(name)){ return new RealCustomer(name); } } return new NullCustomer(); } }

Étape 4

UtilisationCustomerFactory, en fonction du nom fourni par le client, pour obtenirRealCustomerouNullCustomerObjet.

NullPatternDemo.java

public class NullPatternDemo { public static void main(String[] args) { AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob"); AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob"); AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie"); AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura"); System.out.println("Clients"); System.out.println(customer1.getName()); System.out.println(customer2.getName()); System.out.println(customer3.getName()); System.out.println(customer4.getName()); } }

Étape 5

Exécutez le programme, le résultat s'affiche :

Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database
autres extensions