Question

Quelqu'un peut-il me faire connaître des situations d'exemple où la méthode modèle - modèle doit être utilisé

Donne-moi une utilisation réelle de votre propre expérience.

(je l'ai trouvé jusqu'à présent utile uniquement pour les données cartographiques dans la couche DA. Désolé !!!)

Était-ce utile?

La solution

J'ai essayé de vous donner quelques exemples concrets, et certaines situations communes où motif.Procédé modèle doit être utilisé.

  • Lorsque vous voulez que votre programme soit « Ouvert Extension » et aussi « Fermé pour la modification ». Cela signifie que peut être étendu le comportement du module, de sorte que nous pouvons faire la comportent des modules de façons nouvelles et différentes que les exigences du changement d'application, ou pour répondre aux besoins de nouvelles applications. Cependant, le code source d'un tel module est inviolé. Personne n'est autorisé à modifier le code source lui. dans la suite par exemple, vous pouvez ajouter une nouvelle méthode de calcul des salaires (comme la classe Remotely) sans changer les codes précédents.

    public abstract class Salary {
    
       public final void calculate() {
            System.out.println("First shared tasks is done.");
            getBaseSalary();
            System.out.println("Second shared tasks is done.");
       }
    
       public abstract void getBaseSalary();
    
    }
    
    public class Hourly extends Salary {
    
        @Override
        public void getBaseSalary() {
            System.out.println("Special Task is done.");
        }
    
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Salary salary = ....
            salary.calculate();
        }
    }
    
  • Lorsque vous faites face à un grand nombre même ligne de codes qui sont dupliquées par le report de seulement quelques pas de votre algorithme. Lorsque vous implémentez le contenu d'une méthode ou une fonction, vous pouvez trouver une section de votre un code qui varie d'un type à un autre type. La caractéristique de cette sections sont que l'on peut redéfinir ou modifier ces sections d'une méthode ou une fonction sans changer (méthode ou fonction) de l'algorithme structure principale. Par exemple, si vous voulez résoudre ce problème sans ce modèle vous face à cet exemple:

function0: function1: ... fonction personnaliséeN:

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

Comme vous pouvez le voir, la section morues 5, 6, n sont différentes varient d'une fonction à une autre fonction, mais vous avez des sections communes telles que la 1,2,3,4 qui sont dupliqués. Lets envisager une solution avec l'un des célèbres bibliothèques java.

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • Lorsque vous en tant que concepteur d'un cadre, voulez que vos clients simplement d'utiliser un code exécutable qui est passé comme argument à votre cadre, qui devrait rappeler (exécuter) cet argument à un temps donné. Cette exécution peut être immédiate comme dans un rappel synchrone, ou il peut arriver à un moment plus tard, comme dans un rappel asynchrone. Lets considérer l'un des célèbres les.

    public abstract class HttpServlet extends GenericServlet 
        implements java.io.Serializable  {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
            ...
        }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            ....
            doGet(req, resp);
            ...
        }
        ...
    }
    }
    
    public class MyServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
                //do something
            ...
        }
        ...
    }
    

Autres conseils

Un modèle de procédé Modèle fournit un squelette pour réaliser toute sorte d'algorithme ou une opération, et il permet aux sous-classes de redéfinir partie de la logique.

Avantages: ajustement naturel pour les cadres de construction, de sorte que les classes cadres parent peut faire callbacks dans les méthodes mises en œuvre dans l'enfant

.

Exemples:

  • java.util.AbstractList
  • méthodes de Servlet doGet et doPost
  • La méthode onMessage de MDB
  • Struts classe Action
  • classes d'accès aux données de printemps

Moins:. Vous Restreint à un seul héritage en Java

Une application de la Template Method motif a deux caractéristiques principales:

  1. Il y a une classe de base (en Java, un uniquement avec les constructeurs de protected et éventuellement déclarés comme abstract) qui sera sous-classé dans le code client.
  2. Il y a deux groupes de méthodes défini dans la classe de base: a) un ou plusieurs Méthodes de modèle (typiquement un seul) et un ou plusieurs opération primitive méthodes (généralement plus d'un). Chaque méthode de modèle représente une opération de haut niveau, mis en oeuvre dans la classe de base lui-même en termes d'opérations primitives, qui sont destinés à mettre en oeuvre / overriden dans chaque sous-classe spécifique. Normalement, le procédé de modèle est public et non-substituable (final, en Java); la documentation de l'API doit indiquer précisément quelles méthodes de fonctionnement primitives qu'elle appelle, et quand (c'est, il doit décrire le « algorithme »). Une méthode d'opération primitive, ce qui représente une étape dans l'algorithme, doit être non-public, mais Overridable (protected, en Java), et peut être de deux types: a) une méthode abstraite qui doit mise en œuvre dans la sous-classe; b) une méthode avec un défaut / mise en œuvre vide qui peut être outrepassée dans la sous-classe.

Un bon exemple dans le SDK Java 6 est la méthode execute() de la classe javax.swing.SwingWorker (il est une méthode de public final void). Dans ce cas, les méthodes d'exploitation primitives sont doInBackground(), process(List) et done(). Le premier est abstrait et nécessite donc une mise en œuvre dans la sous-classe; il est appelé par la méthode du modèle dans un thread d'arrière-plan. Les deux autres ont des implémentations vides et peut éventuellement être remplacée dans la sous-classe; ils sont appelés pendant et à la fin du traitement, respectivement, dans l'EDT (Dispatch événement swing fil), pour permettre des mises à jour de l'interface utilisateur.

Dans ma propre expérience, j'ai parfois utilisé ce modèle. Un tel cas était une classe de base Java implémentant l'interface java.util.Iterator, où next() était la méthode de modèle et il n'y avait qu'une seule méthode de fonctionnement primitive responsable de l'instanciation d'une classe spécifique d'entité de domaine (ce qui a été conçu pour être utilisé lors de l'itération sur une liste de domaine persistant objets entité, en utilisant JDBC). Un meilleur exemple dans cette même demande était une classe de base où la méthode du modèle mis en œuvre un algorithme en plusieurs étapes destiné à alimenter un « écran de maintenance d'entité commerciale » (en utilisant Swing) à partir d'une liste donnée d'entités persistantes; méthodes d'opérations primitives ont été appelés à 1) effacer l'état actuel de l'écran, et 2) ajouter une entité dans une vue de tableau à l'intérieur de l'écran; éventuellement, d'autres opérations primitives ont été appelées à partir de la méthode du modèle si l'écran est modifiable.

En fin de compte, je dois dire que bien que ce soit certainement un modèle de conception utile, pas si souvent une situation arrive où il est vraiment applicable. Il suffit d'avoir une classe de base avec des méthodes qui s'outrepassée dans une sous-classe (une situation beaucoup plus fréquente, dans mon expérience) ne suffit pas, par lui-même, pour être considéré comme une application du motif.

La chose la plus importante dans la méthode du modèle est que vous devez définir une série de méthodes abstraites comme des étapes ou un algorithme et laisser le sous succédané de classe avec la mise en œuvre concrète de ces méthodes.

J'ai appliqué dans l'un des programmes de génération de documents.

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

Vous pouvez avoir différents implementation comme générateur de PDF générateur csv et la valeur ici est qu'ils Comform à l'algorithme (génération -> en-tête, le corps, les détails).

Un motif de modèle doit être utilisé quand il y a un algorithme avec de nombreuses implémentations. L'algorithme est défini dans une fonction dans la classe de base et la mise en œuvre se fait par la classe de base et les sous-classes. Une explication détaillée avec un exemple en temps réel est donné dans http://preciselyconcise.com/design_patterns/templatemethod.php

Je vais esquisser un exemple du monde réel où j'ai utilisé quelques méthodes de modèle.

Dans une application C ++ algorithme de vision par ordinateur le comportement de l'algorithme a été conçu pour prendre quelques saveurs du comportement de l'algorithme basé sur certaines options de lecture lors de l'exécution selon un ENUM caché dans un fichier de configuration chargé au démarrage. Le squelette d'ensemble de l'algorithme était identique sauf pour certains callbacks clés en peluche au milieu de ce qui serait autrement une section identique de code qui serait brutalement dupliquée juste pour appeler différentes fonctions à ce niveau. Ces callbacks je voulais utiliser ont été extraites dans la classe de base de la méthode de modèle et le modèle de la méthode du modèle ont empêché tout ce que la duplication de code. Le ENUM, nous avons utilisé essentiellement dicté ce que je sous-classe instancié mon pointeur de classe de base pour pointer vers et donc prêter l'algorithme de son bit associé de goût dans le comportement.

Aujourd'hui, certains des motivations derrière cette variété de saveurs de l'algorithme en cours d'exécution est une fonctionnalité en ligne vs hors ligne de logiciel qui contrôle notre instrument. La saveur hors ligne tiré avec elle plus riche debug / sortie de diagnostic et gardé localement un système de coordonnées à certains pixels de l'image tandis que la saveur en ligne ont gardé les choses dans un espace de coordonnées absolu et maintenu des préoccupations propres à l'instrument en cours d'exécution avec tous ses robotique et que non. Une autre ENUM a conduit une sélection parmi un ensemble de classificateurs nous avons utilisé pour un apprentissage de la machine aussi bien depuis différents classificateurs ont été formés sous différents ensembles de données qui, autrement, s'écoulait identiquement à travers le corps de code, mais devaient être interprétées différemment selon certaines conditions de la façon dont que les données a été créé.

Je crois que ce genre de cas d'utilisation j'avais pris naissance de ce qui a été appelé trou dans le milieu problème.

Je l'ai utilisé la méthode de modèle pour la logique métier où un certain nombre de composants partagés le même processus, mais la mise en œuvre était légèrement différente.

  

La méthode de modèle définit la structure de squelette d'un algorithme, mais   sursoit certaines étapes et les détails aux sous-classes. La structure et la   de l'algorithme restent statiques, mais les détails des étapes sont   différée aux sous-classes.

je méthode Modèle modèle pour préparer le contenu du document. Il y avait beaucoup de différents types de documents que chaque type a ses propres petites modifications. Cependant, le processus principal de préparation des documents était la même pour tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top