Code Java de l'exemple du patron État (tramway).

/*
 * Copyright (c)
 *  ENSICAEN, École publique d'ingénieurs et centres de recherche, Caen, FRANCE.
 *  https://www.ensicaen.fr
 *
 *  This file is licenced under the MIT License.
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package fr.ensicaen.gl2a.lecture;

public final class Etat2 {
    public static void main( String[] args ) {
        Tramway tramway = new Tramway();
        tramway.appuiBoutonProchainArret();
        tramway.appuiBoutonOuverturePorte();
        tramway.appuiBoutonArretUrgence();
    }
}

final class Tramway {
    private EtatTramway _etatTramway = new Deplacement();

    void appuiBoutonArretUrgence() {
        _etatTramway.appuiBoutonArretUrgence();
    }

    void appuiBoutonOuverturePorte() {
        _etatTramway.appuiBoutonOuverturePorte();
    }

    void appuiBoutonProchainArret() {
        _etatTramway.appuiBoutonProchainArret();
    }

    abstract class EtatTramway {
        abstract void appuiBoutonArretUrgence();

        abstract void appuiBoutonOuverturePorte();

        abstract void appuiBoutonProchainArret();
    }

    final class Deplacement extends EtatTramway {

        @Override
        void appuiBoutonArretUrgence() {
            System.out.println("Stoppe le tramway en urgence.");
            _etatTramway = new ArretUrgence();
        }

        @Override
        void appuiBoutonOuverturePorte() {
            // désactivé}
        }

        @Override
        void appuiBoutonProchainArret() {
            System.out.println("Demande d'arrêt.");
            _etatTramway = new ArretImminent();
        }
    }

    final class ArretImminent extends EtatTramway {

        @Override
        void appuiBoutonArretUrgence() {
            System.out.println("Stoppe le tramway en urgence.");
            _etatTramway = new ArretUrgence();
        }

        @Override
        void appuiBoutonOuverturePorte() {
            // désactivé
        }

        @Override
        void appuiBoutonProchainArret() {
            // désactivé
        }
    }

    final class ArretStation extends EtatTramway {

        @Override
        void appuiBoutonArretUrgence() {
            System.out.println("Stoppe le tramway en urgence.");
            _etatTramway = new ArretStation();
        }

        @Override
        void appuiBoutonOuverturePorte() {
            System.out.println("Ouverture des portes");
        }

        @Override
        void appuiBoutonProchainArret() {
            // désactivé
        }
    }

    final class ArretUrgence extends EtatTramway {

        @Override
        void appuiBoutonArretUrgence() {
            System.out.println("Relance le tramway");
            _etatTramway = new ArretStation();
        }

        @Override
        void appuiBoutonOuverturePorte() {
            System.out.println("Ouverture des portes");
        }

        @Override
        void appuiBoutonProchainArret() {
            // Désactivé
        }
    }
}
Modifié le: Saturday 13 October 2018, 08:36