"Head First Design Patterns" notes d'étude - Méthode Modèle motif

Procédé motif modèle.

cas

Le thé et le café est très similaire aux étapes, les étapes de café:

  1. Faire bouillir l'eau
  2. Café infusé avec de l'eau bouillante
  3. Elle versa du café dans une tasse
  4. Le sucre et le lait

étapes de thé:

  1. Faire bouillir l'eau
  2. Thé avec immersion dans l'eau bouillante
  3. Le thé versé dans la tasse
  4. avec du citron

Ainsi, le code du café est la suivante:

public class Coffee {

    void prepareRecipe() {
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        addSugarAndMilk();
    }

    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void brewCoffeeGrinds() {
        System.out.println("Dripping Coffee through filter");
    }

    public void pourInCup() {
        System.out.println("Pouring into cup");
    }

    public void addSugarAndMilk() {
        System.out.println("Adding Sugar and Milk");
    }
}

Code de thé:

public class Tea {
    
    void prepareRecipe() {
        boilWater();
        steepTeaBag();
        pourInCup();
        addLemon();
    }

    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void steepTeaBag() {
        System.out.println("Steeping the tea");
    }
    
    public void addLemon() {
        System.out.println("Adding Lemon");
    }
    
    public void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

Il est évident duplication de code, de sorte que nous pouvons extraire les parties communes:

  1. Faire bouillir l'eau
  2. Avec du café ou du thé chaud
  3. Les boissons versé dans une tasse
  4. Ajouter les épices appropriées dans la boisson

La première étape et la troisième étape est public et peut être retiré, alors que la deuxième étape et la quatrième étape n'est pas au même endroit, seulement un verre ou assaisonnement tout simplement pas la même chose.

Nous avons d'abord en 3 étapes aspirée dans la superclasse.

public abstract class CaffeineBeverage {
    
    public abstract void prepareRecipe();

    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

Cependant, le 2,4-étape est très similaire, donc nous sommes également définis dans la superclasse, modifier et voir.

public abstract class CaffeineBeverage {

    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    protected abstract void addCondiments();

    protected abstract void brew();

    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

Nous avons mis deux étapes 2,4 abstraction, et d'autres sous-catégories pour atteindre leurs fonctions spécifiques. Après la transformation que le thé et le café.

public class Tea extends CaffeineBeverage {

    @Override
    protected void addCondiments() {
        System.out.println("Adding Lemon");
    }

    @Override
    protected void brew() {
        System.out.println("Steeping the tea");
    }
}

public class Coffee extends CaffeineBeverage {

    @Override
    protected void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }

    @Override
    protected void brew() {
        System.out.println("Dripping Coffee through filter");
    }
}

Le thé et le café sont héritées de la caféine des boissons, ils sont tenus de mettre en œuvre brew () et la méthode addCondiments () eux - mêmes. C'est le modèle de la méthode de modèle, méthode preareRecipe () est notre modèle, il est utilisé comme un algorithme de modèle, l'algorithme fait référence à la production de boissons de caféine. Chaque étape de l'algorithme sont une façon de représenter. La méthode définit les étapes d' un modèle les algorithmes et permettent une mise en œuvre des sous - classes fournissent pour une ou plusieurs étapes.

définitions

Modèle de motif Méthode définit un algorithme squelette Dans un procédé, des étapes pour retarder les sous-classes. méthodes de modèles tels sous-classes sans changer la structure de l'algorithme, quelques-unes des étapes de l'algorithme sont redéfinis.

En fait, des mesures similaires sur plusieurs classes semblables ont, ces étapes peuvent être abstraites, mis en œuvre par les sous-classes, cet algorithme peut faire en sorte que la structure reste inchangée, tout en fournissant une partie atteint par les sous-classes.

Nous pouvons également crochet est fixé, la déclaration à notre classe abstraite ou implémentation par défaut creux de la méthode. Peut être sous-classe de place pour l'expansion, de sorte que les sous-classes ont la possibilité de pointer vers un algorithme différent n'est pas la même étape, spécifique ou non lié à la sous-classe. Laissez-nous d'abord un exemple:

public abstract class CaffeineBeverageWithHook {
    
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    private boolean customerWantsCondiments() {
        return true;
    }

    protected abstract void addCondiments();

    protected abstract void brew();

    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

Nous avons ajouté une instruction conditionnelle, la condition est () méthode retourne une valeur déterminée par les customerWantsCondiments. Si le client veut des épices, retourne true, la méthode addCondiments d'exécution (), qui est un crochet, une sous-classe peut remplacer cette méthode, mais ne doit pas nécessairement être couvert. Nous continuons de modifier notre code:

public class CoffeeWithHook extends CaffeineBeverageWithHook {
    @Override
    protected void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }

    @Override
    protected void brew() {
        System.out.println("Dripping Coffee through filter");
    }

    public boolean customerWantsCondiments() {
        String answer = getUserInput();

        if (answer.toLowerCase().startsWith("y")) {
            return true;
        } else {
            return false;
        }
    }

    private String getUserInput() {
        String answer = null;

        System.out.println("Would you like milk and sugar with your coffee (y/n)?");

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            answer = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (answer == null) {
            return "no";
        }
        return answer;
    }
}

Tout d'abord, nous atteignons la BREW () et la méthode addCondiments (), puis recouvrir la méthode customerWantsCondiments (), l'y d'entrée utilisateur pour les besoins de l'utilisateur d'ajouter le lait et le sucre, n-contraire, nous exécuter maintenant le programme de test.

public class BeverageTestDrive {
    public static void main(String[] args) {
        CoffeeWithHook coffeeWithHook = new CoffeeWithHook();
        coffeeWithHook.prepareRecipe();
    }
}

Très crochet pratique, à droite, en fait, nous pouvons également mettre directement à la superclasse.

Nous avons maintenant un nouveau principe de conception: « principe d'Hollywood. »

Hollywood Principe: Ne pas appeler (appel), nous appellerons (appel) vous.

Permettre aux composants de bas niveau s'accrochent sur le système, mais l'ensemble de haut niveau décidera quand et comment utiliser ces composants de bas niveau. En d'autres termes, des composants de haut niveau à des composants de bas niveau traitent de façon, « Ne nous appelez pas, nous allons vous appeler. »

Java dans le modèle de procédé de modèle

Trier par méthode de modèle, trier le tableau (Object [] a) méthode de tri est la façon dont nous regardons son code.

public static void sort(Object[] a) {
	Object[] aux = (Object[])a.clone();
	mergeSort(aux, a, 0, a.length, 0);
}

Cette méthode est juste une méthode d'aide est utilisé pour créer une copie du tableau, puis il passe à la méthode mergesort ().

private static void mergeSort(Object src[], Object dest[], int low, int high, int off) {
	for (int i=low; i<high; i++) {
		for (int j=i; j>low && ((Comparable)dest[j-1].compareTo((Comparable)dest[j])>0; j--) {
			swap(dest, j, j-1);
		}
	}
	return;
}

Cette méthode comprend l'algorithme de tri qui repose sur l'algorithme de mise en œuvre de la méthode compareTo () est terminée. Ici, vous pouvez penser comme une méthode de modèle, vous devez implémenter la méthode compareTo (). Maintenant, regardez un exemple. Comparer l'âge de la personne, nous avons besoin d'un homme de classe.

public class People implements Comparable {
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        People o1 = (People) o;
        return Integer.compare(this.age, o1.age);
    }
}

Le programme de test.

public class PeopleSortTestDrive {
    public static void main(String[] args) {
        People[] people = {
                new People("Ab", 12),
                new People("zhangsan", 123),
                new People("lisi", 22),
                new People("wangwu", 53),
                new People("zhaoliu", 66)
        };
        System.out.println("Before sorting: ");
        display(people);
        Arrays.sort(people);
        System.out.println("\nAfter sorting:");
        display(people);
    }

    public static void display(People[] people) {
        for (People person : people) {
            System.out.println(person);
        }
    }
}

La première impression est hors d'usage, second ordre est de petite à grande. Cela montre que nous sommes en quelque sorte de succès, l'étape clé est de réaliser notre méthode compareTo de l'interface Comparable dans notre classe par la méthode Integer compare (int x, int y) pour obtenir plus, donc finalement tout le réseau peut parfaire le tri est terminé .

Ecrire une fenêtre de programme Swing

L'exemple suivant est JFrame Swing! JFrame est le plus conteneur Swing de base, hérité d'une peinture méthode, la peinture ne pas faire l'état par défaut () () les choses parce qu'il est un crochet, le couvrir, nous serons en mesure de mettre leur propre code dans les algorithmes de JFrame .

public class MyFrame extends JFrame {
    public MyFrame(String title) {
        super(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setSize(300, 300);
        this.setVisible(true);
    }

    public void paint(Graphics graphics) {
        super.paint(graphics);
        String msg = "I rule!!";
        graphics.drawString(msg, 100,100);
    }

    public static void main(String[] args) {
        new MyFrame("Head First Design Patterns");
    }
}

Nous utilisons la méthode crochet peinture (), ajoutez le code pour notre propre définition, mais aussi l'apparition du mode d'application.

Publié 26 articles originaux · louange gagné 2 · Vues 2324

Je suppose que tu aimes

Origine blog.csdn.net/qq_42909545/article/details/105008722
conseillé
Classement