JavaRush /Blog Java /Random-FR /Stratégie de modèle (Stratégie)

Stratégie de modèle (Stratégie)

Publié dans le groupe Random-FR
Le modèle Strategy définit une famille d’algorithmes, encapsule chacun d’eux et garantit qu’ils sont interchangeables. Il permet de modifier les algorithmes indépendamment de leur utilisation côté client (cette définition est tirée du livre « Head First. Design Patterns » d'Eric Freeman et Elizabeth Robson). Cette définition semble un peu déroutante, nous devons donc l'expliquer plus en détail dans un langage normal . Commençons par la religion :) Il existe de nombreuses religions dans le monde (confessions, mouvements, croyances, etc.). Comment pourrions-nous décrire cela dans le code. Eh bien, par exemple, nous pourrions suivre le cours de religion et en hériter d’autres religions. Faisons abstraction des éléments inutiles et utilisons une méthode believe() dans la classe Religion.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Toutes les autres religions peuvent être héritées de cette classe. Si nous nous étions limités au christianisme et même à l’islam et au judaïsme, il n’y aurait eu aucun problème.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Mais si l’on pense aux autres religions qui existent aujourd’hui (ou existaient avant, mais ont disparu), alors des problèmes surgiront, du moins avec les bouddhistes. Vous devrez remplacer leur méthode de croyance.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
Et comme il existe de nombreuses religions et qu’elles croient même au monstre des pâtes (pastafarianisme), alors dans toutes ces religions vous devrez redéfinir la méthode de croyance. Mais pouvons-nous faire différemment, déplacer cette méthode vers l'interface Faith et y implémenter la méthode believe et implémenter cette méthode dans chaque classe (et par conséquent l'implémenter dans chaque classe comme nous le souhaitons) ? Mais nous aurons alors droit à une duplication du code, du moins parmi les juifs et les chrétiens. Les musulmans de Dieu peuvent écrire en arabe.
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Implémenter la méthode par défaut n'aidera pas beaucoup ici ; il y a tellement de religions que même si vous définissez cette méthode par défaut dans l'interface Faith, vous devrez implémenter cette méthode à votre manière dans toutes les religions non monothéistes, et la répéter quelque part. Que nous offre le modèle Strategy dans ce cas : il propose de créer des classes modèles prêtes à l'emploi pour l'interface actuelle, qui seront ensuite substituées au constructeur d'une religion spécifique. Ceux. définir et créer la même famille d'algorithmes que celle mentionnée au début de la définition.
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
Et dans chaque classe du constructeur, remplacez-les.
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
Ainsi, si vous devez inclure une autre religion dans votre projet, vous n'aurez pas à redéfinir la méthode de croyance pour tous les cours ou parties de cours. Et il vous suffira d'implémenter la classe manquante (s'il n'y en a pas déjà) qui implémente l'interface Faith et d'ajouter cette classe dans le constructeur de la nouvelle religion.
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION