[JAVA] Expliquez les mérites du modèle d'État avec le jugement de notation du film

Implémentez les œuvres que l'utilisateur peut voir afin qu'elles puissent être triées en fonction du système de notation du film.

Le système de classification des films est une réglementation limitant l'âge. G: tous âges PG12: 12 ans et plus R15 +: 15 ans et plus R18 +: 18 ans et plus Il existe des catégories telles que.

Diagramme de classe

Le modèle d'état est dans le cadre rouge, et il est utilisé par l'utilisateur. image.png Le RatingSystem est utilisé comme interface et chaque restriction est implémentée dans G / PG12 / R15. L'absence de R18 suppose que vous n'avez pas affaire à des films R18.

mérite

-La limite d'âge peut être limitée à la classe d'implémentation RatingSystem (G / PG / R15). (Localisation de l'implémentation) ・ Les films R18 seront traités, et même si des spécifications sont ajoutées, ils peuvent être facilement traités. (Facile à changer)

Code source

interface RatingSystem

RatingSystem.java


package state.rating;

public interface RatingSystem {
    public boolean checkLimit(int age);
}

class G

G.java


package state.rating;

public class G implements RatingSystem {

    @Override
    public boolean checkLimit(int age) {
        return true;
    }
}

class PG12

PG12.java


package state.rating;

public class PG12 implements RatingSystem {

    @Override
    public boolean checkLimit(int age) {
        if(12 <= age)
            return true;
        return false;
    }
}

class R15

R15.java


package state.rating;

public class R15 implements RatingSystem {

    @Override
    public boolean checkLimit(int age) {
        if(15 <= age)
            return true;
        return false;
    }
}

class Movie

Movie.java


package state.rating;

public class Movie {
    private String _title;
    private RatingSystem _rating;

    public Movie(String title, RatingSystem rating) {
        _title = title;
        _rating = rating;
    }

    public String title() {
        return _title;
    }

    public boolean checkLimit(int age) {
        return _rating.checkLimit(age);
    }
}

class User

User.java


package state.rating;

public class User {
    private String _name;
    private int _age;

    User(String name, int age){
        _name = name;
        _age = age;
    }

    public String name() {
        return _name;
    }

    public int age() {
        return _age;
    }

    public void play(Movie movie) {
        System.out.println(movie.title() + "Jouer.");
        if(!movie.checkLimit(_age)) {
            System.out.println(" >>>Impossible de jouer en raison d'une erreur de limite d'âge.");
            stop(movie);
        }
    }

    public void stop(Movie movie) {
        System.out.println(movie.title() + "Arrêter.");
    }
}

Principale

Main.java


package state.rating;

public class Main {
    public static void main(String... args) {

        Movie torasan = new Movie("C'est dur pour un homme, Torajiro Sunset, petite brûlure", new G());
        Movie titan = new Movie("Avancer une attaque géante sur TITAN", new PG12());
        Movie jingi = new Movie("Bataille sans justice", new R15());

        User shinnosuke = new User("Shinnosuke Nohara", 5);
        System.out.println(shinnosuke.name());
        shinnosuke.play(torasan);
        shinnosuke.play(titan);
        shinnosuke.play(jingi);
        System.out.println();

        User taro = new User("Taro", 12);
        System.out.println(taro.name());
        taro.play(torasan);
        taro.play(titan);
        taro.play(jingi);
        System.out.println();

        User hanako = new User("Hanako", 17);
        System.out.println(hanako.name());
        hanako.play(torasan);
        hanako.play(titan);
        hanako.play(jingi);
        System.out.println();
    }
}

Résultat d'exécution

En fonction de l'âge de chaque utilisateur, les films capturés dans la limite d'âge seront arrêtés de force.

Shinnosuke Nohara L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez le géant de mars ATTAQUE SUR TITAN. Jouez une bataille sans justice. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez la bataille sans justice.

Taro L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. Jouez une bataille sans justice. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez la bataille sans justice.

Hanako L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. Jouez une bataille sans justice.

Prise en charge des exigences supplémentaires pour R18 +

En pratique, les changements de spécifications sont courants. Ici, nous supposons une situation où «des exigences supplémentaires pour la gestion des films R18 se sont produites».

"J'ai décidé de gérer les films R18, alors pouvez-vous le réparer?" Si on vous le dit, vous devriez pouvoir le changer immédiatement, non?

S'il s'agit d'un modèle State, ajoutez la classe R18 et vous avez terminé. Il n'est pas nécessaire de rechercher et de corriger le processus de jugement de limite d'âge (si déclaration) ici et là.

class R18

R18.java


package state.rating;

public class R18 implements RatingSystem {

    @Override
    public boolean checkLimit(int age) {
        if(18 <= age)
            return true;
        return false;
    }
}

Principale

Main.java


package state.rating;

public class Main {
    public static void main(String... args) {

        Movie torasan = new Movie("C'est dur pour un homme, Torajiro Sunset, petite brûlure", new G());
        Movie titan = new Movie("Avancer une attaque géante sur TITAN", new PG12());
        Movie jingi = new Movie("Bataille sans justice", new R15());
        Movie devil = new Movie("Monstre venimeux du diable", new R18());   //* Notes complémentaires

        User shinnosuke = new User("Shinnosuke Nohara", 5);
        System.out.println(shinnosuke.name());
        shinnosuke.play(torasan);
        shinnosuke.play(titan);
        shinnosuke.play(jingi);
        shinnosuke.play(devil); //* Notes complémentaires
        System.out.println();

        User taro = new User("Taro", 12);
        System.out.println(taro.name());
        taro.play(torasan);
        taro.play(titan);
        taro.play(jingi);
        taro.play(devil);   //* Notes complémentaires
        System.out.println();

        User hanako = new User("Hanako", 17);
        System.out.println(hanako.name());
        hanako.play(torasan);
        hanako.play(titan);
        hanako.play(jingi);
        hanako.play(devil); //* Notes complémentaires
        System.out.println();

        //* Notes complémentaires
        User isekai = new User("Un étudiant universitaire réincarné dans un autre monde", 18);
        System.out.println(isekai.name());
        isekai.play(torasan);
        isekai.play(titan);
        isekai.play(jingi);
        isekai.play(devil);
        System.out.println();
    }
}

Résultat d'exécution

Parmi les utilisateurs ci-dessus, celui qui peut regarder le film R18 (Devil's Poisonous Monster) est Seuls les «étudiants universitaires qui se sont réincarnés dans un autre monde» qui ont 18 ans.

Shinnosuke Nohara L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez le géant de mars ATTAQUE SUR TITAN. Jouez une bataille sans justice. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez la bataille sans justice. Jouez au monstre venimeux du diable. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez le monstre venimeux du diable.

Taro L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. Jouez une bataille sans justice. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez la bataille sans justice. Jouez au monstre venimeux du diable. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez le monstre venimeux du diable.

Hanako L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. Jouez une bataille sans justice. Jouez au monstre venimeux du diable. \ >>> Impossible de jouer en raison d'une erreur de limite d'âge. Arrêtez le monstre venimeux du diable.

Un étudiant universitaire réincarné dans un autre monde L'homme est douloureux, Torajiro joue la petite brûlure du coucher du soleil. Jouez au géant de mars ATTACK ON TITAN. Jouez une bataille sans justice. Jouez au monstre venimeux du diable.

Résumé

・ Le jugement et les fonctions basés sur le statut peuvent être limités à une classe spécifique. (Localisation de l'implémentation) -Il est relativement facile d'ajouter ou de modifier des spécifications. (Facile à changer)

Recommended Posts

Expliquez les mérites du modèle d'État avec le jugement de notation du film
Refactoriser l'implémentation du pattern Decorator avec une interface fonctionnelle
L'histoire de la création d'un proxy inverse avec ProxyServlet
Surveillez l'état interne des programmes Java avec Kubernetes
Une histoire remplie des bases de Spring Boot (résolu)
Vérifier le fonctionnement de deux rôles avec une application de chat
Trouvez le nombre de jours dans un mois avec Kotlin
L'histoire du refactoring avec un assistant personnel pour la première fois dans une application Rails
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
[Illustration] Recherche de la somme des pièces avec une fonction récursive [Ruby]
Un mémorandum du problème FizzBuzz
Expliquez la colonne de Spree :: Product
Monad est un modèle de conception pour "exprimer l'existence d'effets secondaires dans une méthode avec un type de retour"
Application Android: expliquons le mécanisme de transition d'écran avec un code simple
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
(Mémo) Obtenez un ensemble de jars de bibliothèque dépendants à l'aide de Gradle
Quelle fabrique de modèles de stratégie, pas un état
Créez un fichier jar avec la commande
Vérifiez le contenu des paramètres avec le levier
Exécutez DMN à l'aide du moteur Camunda DMN
Extraire une partie d'une chaîne en Ruby
À propos du traitement de BigDecimal (avec réflexion)
J'ai étudié le modèle d'état et le modèle de stratégie
Mettre en forme le contenu de LocalDate avec DateTimeFormatter
Trouvez la différence à partir d'un multiple de 10
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Envoyez des notifications à Slack avec la version gratuite de sentry (en utilisant lambda)
Valider le jeton d'ID d'un utilisateur authentifié par AWS Cognito en Java
Une note rapide sur l'utilisation de jshell avec l'image Docker officielle du JDK