Résumé du modèle de conception Java GoF

Cet article est un résumé personnel de «Introduction aux modèles de conception appris dans le langage Java»

Iterater

Objectif

Accédez aux éléments dans l'ordre, comme un tableau.

Contenu

hasNext () retourne avec booléen s'il contient les éléments suivants: Ensuite, vérifiez les éléments et exécutez next () next () accède à l'élément suivant

Adopter

Objectif

Éliminez les écarts entre les API

mérite

La réutilisation est améliorée en créant des pièces qui peuvent être insérées entre les deux API pour éliminer l'écart. Implémentez l'interface souhaitée (API) sans apporter aucun ajustement aux classes existantes

Template Method

Objectif

Le cadre de traitement est décidé dans la super classe et le traitement spécifique est décrit dans la sous-classe.

mérite

La logique peut être partagée.

Mise en garde

La classe parente est définie par une classe abstraite. S'il s'agit d'une interface, la classe parente ne peut pas écrire le processus.

Factory Method

Objectif

Définissez l'instanciation dans la classe parente (ne définissez pas de nom de classe spécifique). Dans la classe enfant, la chair est faite.

Singleton

Objectif

Un seul instancier En rendant le constructeur privé, vous pouvez empêcher l'instanciation en dehors de la classe. La seule façon d'accéder à une instance est de ne renvoyer qu'une seule instance avec getInstance ().

Mise en garde

private static Singleton singleton = null;
if(singleton == null){
    singleton = new Singleton;
}

Avec l'expression conditionnelle, plusieurs instances peuvent être créées en fonction de l'état de la machine lorsqu'elle est exécutée dans plusieurs threads. Rendez-le asynchrone ou créez-le à l'avance.

Prototype

Objectif

Copiez et créez une instance.

Mise en garde

La méthode de clonage est une copie superficielle. Remplacez et implémentez la copie complète, qui copie le contenu de l'instance. shallow copy copie simplement le contenu des champs de l'instance tels quels. La méthode clone ne s'initialise pas, elle doit donc être initialisée séparément.

Builder

Objectif

Créez la structure entière dans la classe parente et construisez pas à pas un traitement complexe En augmentant l'indépendance, il est plus facile de comprendre les corrections et les ajouts.

Abstract Factory

Objectif

Utilisez des usines abstraites et des parties abstraites.

Mise en garde

Il est facile d'ajouter une usine de béton. Difficile d'ajouter de nouvelles pièces (pour toute l'usine de béton)

Bridge

Objectif

Séparez les fonctions et les implémentations et reliez-les. Fonction: traitement, etc. Implémentation: Classe lorsqu'elle est utilisée pour l'implémentation

Si vous augmentez le nombre de fonctions, toutes les fonctions seront ajoutées à la classe d'implémentation, il sera donc plus facile d'augmenter les fonctions.

Mise en garde

La mise en œuvre étant souvent compliquée, elle n'est utilisée que lorsque la partie de mise en œuvre est fréquemment modifiée. Par exemple, comment gérer la dépendance au système d'exploitation Vous pouvez modifier l'implémentation sans modifier la fonctionnalité.

Facade

Objectif

Simplifiez l'interface. Cachez le traitement compliqué. Il sert de fenêtre pour un traitement compliqué.

Mise en garde

Rendre uniquement le package accessible

//public
public class Sample{

}

//Rendez-le accessible uniquement dans le package.
class Sample{

}

Strategy

Objectif

L'algorithme peut être modifié. En utilisant la délégation, la connexion est plus faible que l'héritage et l'algorithme peut être facilement modifié.

Composite

Objectif

Faites-en une structure en bois. Identifiez le conteneur et le contenu pour créer une structure récursive. composite-> "mélange" "composite"

FileDirectory Le répertoire de fichiers contient des fichiers et des répertoires. Lorsque vous regardez les fichiers dans l'ordre, assimilez-les à des sous-répertoires ou des fichiers. image.png

Le répertoire peut accéder à Entry de manière récursive. Si le fichier est une structure arborescente, laisse Le répertoire est une branche.

Exemple

Decorator

Objectif

Depuis le cœur de la fonction, couvrez-la d'une peau à l'autre et ajoutez-la. Des fonctions peuvent être ajoutées sans ajouter de contenu. En utilisant la délégation, un couplage lâche est possible et des fonctions dynamiques peuvent être ajoutées. Tout en conservant l'interface transparente (API), nous ajouterons des fonctions en couvrant avec des objets.

Démérite

Le nombre de petites classes augmentera.

(Edition supplémentaire) Héritage et délégation

Les sous-classes d'héritage peuvent être assimilées à des superclasses.

class Parent {
    ...
    void parentMethod(){
        ...
    }
}
class Child extends Parent {
    ...
    void childMethod(){
        ...
    }
}

Parent obj = new Child(); obj.parentMethod(); Une instance de Child peut être affectée à une variable de type Parent telle quelle. Vous pouvez appeler des méthodes héritées de Parent. En d'autres termes Traite une instance de Child comme s'il s'agissait d'une instance de Parent. </ font> </ strong> Ceci est un exemple de considérer une sous-classe comme une superclasse


vice versa Cast requis pour considérer la superclasse comme sous-classe

Parent obj = new Child(); ((Child)obj).childMethod();

Délégation-Identifiez-vous et le délégué

Si l'interface est transparente à l'aide de la délégation, vous pouvez vous assimiler à la destination de la délégation.

class Rose {
    Violet obj = ...
    void method(){
        obj.method();
    }
}

class Violet {
    void method(){
        ...
    }
}

Rose et Violet ont la même méthode, et Rose délègue à Violet ... mais il n'est pas précisé que ce sont des méthodes courantes.

abstract class Flower {
    abstract void method();
}

interface Flower {
    abstract void method();
}

Peut être spécifié comme ci-dessus Utiliser correctement selon le cas.

Visitor

Objectif

Structure et traitement des données séparés. Créez une classe de visiteur qui visite la structure de données et demandez à cette classe de la gérer.

image.png

Effectue un traitement spécifique sur l'élément contenant la structure de données. Le modèle Visiteur améliore l'indépendance des classes File et Directory en tant que parties. Si vous programmez le contenu du processus comme une méthode de la classe File ou Directory, vous devrez modifier la classe File ou Directory à chaque fois que vous voudrez ajouter un nouveau "processus" et étendre la fonction.

Autre

LSP (principe de remplacement de Riskov)

Si la classe parent est vraie pour l'expression relationnelle, alors la petite classe dérivée de la classe parent est également vraie. (Possibilité de substitution)

The Open-Closed Principle N'interdisez pas l'expansion future à moins que vous n'ayez une raison spécifique de le faire. Mais vous ne pouvez pas avoir à modifier une classe existante chaque fois que vous l'étendez.

En d'autres termes, autoriser l'extension des classes existantes sans modification </ strong> C'est.

Les classes hautement réutilisables sont fermées. Les chaînes sont fermées car elles sont hautement réutilisables et inefficaces lorsqu'elles sont développées. (Ne peut pas être étendu car il est défini dans la classe finale)

Recommended Posts