Állapot (tervezési minta)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2014. március 25-én áttekintett verziótól ; az ellenőrzések 20 szerkesztést igényelnek .
Állapot
Állapot
Típusú viselkedési
Leírása: Tervezési minták Igen

Az állapot ( Eng.  State ) egy viselkedési tervezési minta . Olyan esetekben használják, amikor a program végrehajtása során az objektumnak állapotától függően meg kell változtatnia viselkedését.

A minta 3 blokkból áll:

A widget egy olyan osztály, amelynek objektumainak az állapottól függően meg kell változtatniuk viselkedésüket.

Az IState egy interfész , amelyet a konkrét állapotok mindegyikének implementálnia kell. Ezen a felületen keresztül a Widget objektum kölcsönhatásba lép az állapottal azáltal, hogy metódushívásokat delegál rá. Az interfésznek tartalmaznia kell a visszacsatolás eszközeit a megváltoztatandó objektumhoz. Ehhez egy eseményt használnak ( minta Kiadó - Előfizető ). Erre azért van szükség, hogy a program végrehajtása során események bekövetkezésekor lecseréljük az állapotobjektumot. Előfordulhatnak olyan esetek, amikor maga a Widget időnként lekérdezi az állapotobjektumot az átmenetre vonatkozóan.

StateA ... StateZ - konkrét állapotok osztályai. Információkat kell tartalmaznia arról, hogy az objektum milyen feltételek mellett és milyen állapotban léphet át az aktuális állapotból. Például egy objektum az ÁllapotA-ból a StateB-be és a StateC-be, az ÁllapotB-ból vissza az ÁllapotA-ba és így tovább. Az egyik objektumának tartalmaznia kell a widgetet a létrehozáskor.

Ennek a mintának az alkalmazása nehéz lehet, ha az állapotoknak kommunikálniuk kell, vagy ha az egyik állapot beállítja a másik tulajdonságait. Ebben az esetben globális objektumra lesz szükség, ami nem túl jó építészeti megoldás.

Példák

C++ példa

Forrásszöveg C++ nyelven #pragma egyszer #include <karakterlánc> #include <iostream> osztály Állam ; osztály StateContext ; osztály SolidState ; osztály LiquidState ; osztály Gasstate ; osztályú állam { std :: karakterláncnév ; _ nyilvános : Állapot ( const std :: string & name ) : név ( név ) {} std :: string GetName () { név visszaadása ; } virtuális üreg Kimerevítés ( StateContext * ) = 0 ; virtuális void Heat ( StateContext * ) = 0 ; }; osztály StateContext { privát : állam * állam ; nyilvános : StateContext ( állam * állapot ) : állapot ( állapot ) {} üres lefagyás () { std :: cout << "Befagyasztás " << állapot -> GetName () << "..." << std :: endl ; állapot -> Lefagyasztás ( ez ); } voidHeat ( ) { std :: cout << "Fűtés " << állapot -> GetName () << "..." << std :: endl ; állapot -> Heat ( ez ); } érvénytelen SetState ( State * s ) { std :: cout << "Állapot megváltoztatása a következőről: " << állapot -> GetName () << " to " << s -> GetName () << "..." << std :: endl ; állapot törlése ; állapot = s ; } állam * GetState () { visszatérési állapot ; } ~ StateContext () { állapot törlése ; } }; osztály SolidState : nyilvános állapot { nyilvános : SolidState () : Állapot ( "Szilárd" ) {} virtual void Freeze ( StateContext * állapot ); virtual void Heat ( StateContext * állapot ); }; osztály LiquidState : nyilvános állapot { nyilvános : LiquidState () : Állapot ( "Liquid" ) {} virtual void Freeze ( StateContext * állapot ); virtual void Heat ( StateContext * állapot ); }; osztály GasState : állami állam { nyilvános : GasState () : Állapot ( "Gáz" ) {} virtual void Freeze ( StateContext * állapot ); virtual void Heat ( StateContext * állapot ); }; érvénytelen SolidState::Freeze ( StateContext * állapot ) { std :: cout << "Semmi nem történik" << std :: endl ; } érvénytelen SolidState::Heat ( StateContext * állapot ) { állapot -> SetState ( new LiquidState ()); } void LiquidState::Freeze ( StateContext * állapot ) { állapot -> SetState ( new SolidState ()); } void LiquidState::Heat ( StateContext * állapot ) { állapot -> SetState ( new GasState ()); } érvénytelen GasState::Freeze ( StateContext * állapot ) { állapot -> SetState ( new LiquidState ()); } érvénytelen GasState::Heat ( StateContext * állapot ) { std :: cout << "Semmi nem történik" << std :: endl ; } érvénytelen teszt () { StateContext * sc = new StateContext ( new SolidState ()); sc -> Heat (); sc -> Heat (); sc -> Heat (); sc -> fagyasztás (); sc -> fagyasztás (); sc -> fagyasztás (); sc törlése ; }

Példa C# -ban

Sablon alkalmazása

Forrásszöveg C# nyelven a rendszer használatával ; névtér Digital_Patterns.Behavioral.State { public interface IAutomatState { String GotApplication (); StringCheckApplication ( ); String RentApartment (); StringDispenseKeys ( ); } nyilvános felület IAutomat { void GotApplication (); érvénytelen CheckApplication (); érvénytelen RentApartment (); void SetState ( IAutomatState s ); IAutomatState GetWaitingState (); IAutomatState GetGotApplicationState (); IAutomatState GetApartmentRentedState (); IAutomatState GetFullyRentedState (); Int32 Szám { get ; készlet ; } } public class Automat : IAutomat { private IAutomatState _waitingState ; privát IAutomatState _gotApplicationState ; privát IAutomatState _apartmentRentedState ; privát IAutomatState _fullRentedState ; privát IAutomatState _state ; privát Int32_count ; _ public Automat ( Int32 n ) { _count = n ; _waitingState = new WaitingState ( ez ); _gotApplicationState = new GotApplicationState ( ez ); _apartmentRentedState = új ApartmanRentedState ( ez ); _fullRentedState = new FullyRentedState ( ez ); _state = _waitingState ; } public void GotApplication () { Konzol . WriteLine ( _state.GotApplication ( ) ); } public void CheckApplication () { Konzol . WriteLine ( _state.CheckApplication ( ) ); } public void RentApartment () { Konzol . WriteLine ( _state.RentApartment ( ) ); Konzol . WriteLine ( _state . DispenseKeys ()); } public void SetState ( IAutomatState s ) { _state = s ; } public IAutomatState GetWaitingState () { return _waitingState ; } public IAutomatState GetGotApplicationState () { return _gotApplicationState ; } public IAutomatState GetApartmentRentedState () { return _apartmentRentedState ; } public IAutomatState GetFullyRentedState () { return _teljesenRentedState ; } public int Szám { get { return _count ; } set { _count = érték ; } } } public class WaitingState : IAutomatState { private Automat _automat ; public WaitingState ( Automat automat ) { _automat = automat ; } public String GotApplication () { _automat . SetState ( _automat . GetGotApplicationState ()); return "Köszönjük a jelentkezést." ; } public String CheckApplication () { return "Jelentkezést kell benyújtania." ; } public String RentApartment () { return "Jelentkezést kell benyújtania." ; } public String DispenseKeys () { return "Jelentkezést kell benyújtania." ; } } public class GotApplicationState : IAutomatState { private Automat _automat ; private readonly Random _random ; public GotApplicationState ( Automat automat ) { _automat = automat ; _random = new Random ( System . DateTime . Now . Milliszekundum ); } public String GotApplication () { return "Már megkaptuk a jelentkezését." ; } public String CheckApplication () { var yesNo = _random . Következő () % 10 ; if ( igenNem > 4 && _automat . Számlálás > 0 ) { _automat . SetState ( _automat . GetApartmentRentedState ()); return "Gratulálunk, jóváhagyták." ; } else { _automatic . SetState ( _automat . GetWaitingState ()); return "Sajnáljuk, nem hagyták jóvá." ; } } public String RentApartment () { return "Ellenőriznie kell a jelentkezését." ; } public String DispenseKeys () { return "Ellenőriznie kell az alkalmazást." ; } } public class ApartmentRentedState : IAutomatState { private Automat _automat ; public ApartmentRentedState ( Automat automat ) { _automat = automat ; } public String GotApplication () { return "Várjon, lakást bérelünk Önnek." ; } public String CheckApplication () { return "Várjon, lakást bérelünk Önnek." ; } public String RentApartment () { _automat . Count = _automat . Szám - 1 ; return "Bérelni neked egy lakást..." ; } public String DispenseKeys () { if ( _automat . Count <= 0 ) _automat . SetState ( _automat . GetFullyRentedState ()); else _automatikus . SetState ( _automat . GetWaitingState ()); return "Itt vannak a kulcsaid!" ; } } public class FullyRentedState : IAutomatState { private Automat _automat ; public FullyRentedState ( Automat automat ) { _automat = automat ; } public String GotApplication () { return "Sajnáljuk, teljesen bérelve vagyunk." ; } public String CheckApplication () { return "Sajnáljuk, teljesen bérelve vagyunk." ; } public String RentApartment () { return "Sajnáljuk, teljesen ki vagyunk bérelve." ; } public String DispenseKeys () { return "Sajnáljuk, teljesen bérelve vagyunk." ; } } class Program { static void Main ( string [] args ) { var automat = new Automat ( 9 ); automata . GotApplication (); automata . Alkalmazás ellenőrzése (); automata . RentApartment (); } } }

Ugyanez a példa, a sablon alkalmazása nélkül

Forrásszöveg C# nyelven a rendszer használatával ; névtér Digital_Patterns.Behavioral.State { public enum Állapot { TELJES_BÉRLET = 0 , VÁRAKOZÁS = 1 , GOT_APPLICATION = 2 , APARTMAN_BÉRLET = 3 , } public class RentalMethods { private readonly Random _random ; private Int32 _numberApartments ; private State _state = Állam . VÁRÁS ; public RentalMethods ( Int32 n ) { _numberApartments = n ; _random = new Random ( System . DateTime . Now . Milliszekundum ); } public void GetApplication () { switch ( _state ) { case State . FULLY_RENTED : Konzol . WriteLine ( "Elnézést, teljesen ki vagyunk bérelve." ); szünet ; eset Állam . VÁRAKOZÁS : _state = Állapot . GOT_APPLICATION ; Konzol . WriteLine ( "Köszönjük a jelentkezést." ); szünet ; eset Állam . GOT_APPLICATION : Konzol . WriteLine ( "Már megkaptuk a jelentkezését." ); szünet ; eset Állam . APARTMENT_RENTED : Konzol . WriteLine ( "Várj, bérelünk neked egy lakást." ); szünet ; } } public void CheckApplication () { var yesNo = _random . következő ()% 10 ; switch ( _state ) { case State . FULLY_RENTED : Konzol . WriteLine ( "Elnézést, teljesen ki vagyunk bérelve." ); szünet ; eset Állam . VÁRAKOZÁS : Konzol . WriteLine ( "Jelentkezést kell benyújtani." ); szünet ; eset Állam . GOT_APPLICATION : if ( igenNem > 4 && _számApartments > 0 ) { Konzol . WriteLine ( "Gratulálunk, jóváhagyták." ); _state = Állapot . BÉRELT LAKÁS ; RentApartment (); } else { Konzol . WriteLine ( "Sajnos nem hagyták jóvá." ); _state = Állapot . VÁRÁS ; } break ; eset Állam . APARTMENT_RENTED : Konzol . WriteLine ( "Várj, bérelünk neked egy lakást." ); szünet ; } } public void RentApartment () { switch ( _state ) { case State . FULLY_RENTED : Konzol . WriteLine ( "Elnézést, teljesen ki vagyunk bérelve." ); szünet ; eset Állam . VÁRAKOZÁS : Konzol . WriteLine ( "Jelentkezést kell benyújtani." ); szünet ; eset Állam . GOT_APPLICATION : Konzol . WriteLine ( "Ellenőriznie kell az alkalmazást." ); szünet ; eset Állam . APARTMENT_RENTED : Konzol . WriteLine ( "Lakást bérelek...." ); _számApartments --; DispenseKeys (); szünet ; } } public void DispenseKeys () { switch ( _state ) { case State . FULLY_RENTED : Konzol . WriteLine ( "Elnézést, teljesen ki vagyunk bérelve." ); szünet ; eset Állam . VÁRAKOZÁS : Konzol . WriteLine ( "Jelentkezést kell benyújtani." ); szünet ; eset Állam . GOT_APPLICATION : Konzol . WriteLine ( "Ellenőriznie kell az alkalmazást." ); szünet ; eset Állam . APARTMENT_RENTED : Konzol . WriteLine ( "Itt vannak a kulcsaid!" ); _state = Állapot . VÁRÁS ; szünet ; } } } class Program { static void Main ( string [] args ) { var rentalMethods = new RentalMethods ( 9 ); bérleti módszerek . GetApplication (); bérleti módszerek . Alkalmazás ellenőrzése (); bérleti módszerek . RentApartment (); bérleti módszerek . DispenseKeys (); } } }

Java példa

Java forrás public class StateExample { public static void main ( String [] args ) { StateContext context = new StateContext (); összefüggésben . hőség (); összefüggésben . hőség (); összefüggésben . hőség (); összefüggésben . lefagy (); összefüggésben . lefagy (); összefüggésben . lefagy (); // KIMENET: // Szilárd anyag felmelegítése... // Halmazállapot váltás folyékonyra... // Folyékony anyag felmelegítése... // Halmazállapot váltás gázneművé... // Gáznemű anyag felmelegítése... // Semmi sem történik . // Gáznemű anyag lefagyasztása ... // Halmazállapot váltása folyékonyra... // Folyékony anyag fagyasztása ... // Halmazállapot váltása szilárdra ... // Szilárd anyag lefagyasztása... // Nem történik semmi. } } interface Állapot { String getName (); void freeze ( StateContext kontextus ); üres ( StateContext kontextus ); } osztály SolidState megvalósítja az állapotot { private static final String NÉV = "szilárd" ; public String getName () { return NÉV ; } public void befagyasztás ( StateContext kontextus ) { Rendszer . ki . println ( "Semmi sem történik." ); } public void heat ( StateContext- kontextus ) { kontextus . setState ( új LiquidState ()); } } osztály LiquidState megvalósítja az állapotot { private static final String NÉV = "folyékony" ; public String getName () { return NÉV ; } public void freeze ( StateContext- környezet ) { context . setState ( newSolidState ( )); } public void heat ( StateContext- kontextus ) { kontextus . setState ( new GaseousState ()); } } osztály GaseousState megvalósítja az állapotot { private static final String NÉV = "gáznemű" ; public String getName () { return NÉV ; } public void freeze ( StateContext- környezet ) { context . setState ( új LiquidState ()); } public void heat ( StateContext kontextus ) { System . ki . println ( "Semmi sem történik." ); } } class StateContext { privát állapot állapot = new SolidState (); public void freeze () { Rendszer . ki . println ( "Befagyasztás " + állapot . getName () + " anyag..." ); állapot . lefagy ( ez ); } public void heat () { Rendszer . ki . println ( "Fűtés " + állapot . getName () + " anyag..." ); állapot . ( ez ); } public void setState ( State state ) { System . ki . println ( "Állapot módosítása " + állapotra . getName () + "..." ); ezt . állapot = állapot ; } public State getState () { return állapot ; } }

Python példa

Forráskód Pythonban abc importból ABCMeta , abstractmethod _ osztály állapota ( metaosztály = ABCMeta ): @abstractmethod def eat ( self ) -> str : át @abstractmethod def find_food ( self ) -> str : pass @abstractmethod def move ( self ) -> str : pass @abstractmethod def dream ( self ) -> str : át osztály SleepState ( állapot ): def eat ( self ) -> str : return 'nem tudok enni alvás közben' def find_food ( self ) -> str : return 'élelmet talál, de csak álmaiban' def move ( self ) -> str : return 'alvás közben nem tud mozogni' def dream ( self ) -> str : return 'aludj és álmodj csodálatosat' osztály OnGroundState ( állam ): def eat ( self ) -> str : return 'a betakarított kagylókat a hasára dobja, és lassan elkezdi enni' def find_food ( self ) -> str : return 'bűzös, de ehető bálna tetemét találja' def move ( self ) -> str : return 'ügyetlenül mászik a partvonal mentén' def dream ( self ) -> str : return 'egy pillanatra megáll, egy ismerős nőről álmodik' osztály InWaterState ( állam ): def eat ( self ) -> str : return 'nem tud enni vízben' def find_food ( self ) -> str : return 'agyarral szántja a tengerfenéket, kagylókat fog a vibrissáival' def move ( self ) -> str : return 'kecsesen átvág a világ óceánjainak hullámain' def dream ( self ) -> str : return 'ne aludj vagy álmodj vízben - ez túl nehéz' osztály rozmár : def __init__ ( self , state : State ) -> None : self . _state = állapot def change_state ( self , state : State ) -> None : self . _state = állapot def eat ( self ) -> None : self . _execute ( 'enni' ) def find_food ( self ) -> None : self . _execute ( 'find_food' ) def move ( self ) -> None : self . _execute ( 'mozgatás' ) def dream ( self ) -> None : self . _execute ( 'álom' ) def _execute ( self , operation : str ) -> None : try : func = getattr ( self . _state , operation ) print ( 'Walrus {} .' . format ( func ())) kivéve AttributeError : print ( 'Romár ezt csinálja nem lehet.' ) if __name__ == '__main__' : sleep = SleepState () on_ground = OnGroundState () in_water = InWaterState () walrus = Walrus ( on_ground ) print ( 'OUTPUT:' ) walrus . change_state ( in_water ) rozmár . mozog () rozmár . ételkereső () rozmár . change_state ( on_ground ) walrus . eszik () rozmár . mozog () rozmár . álom () rozmár . change_state ( alvás ) rozmár . álom () ''' KIMENET: Rozmár kecsesen átvágja az óceánok hullámait. A rozmár agyaraival felszántja a tenger fenekét, vibrisszáival pedig puhatestűeket fog ki. A rozmár a hasára dobja a kitermelt puhatestűeket, és lassan elkezdi megenni őket. A rozmár ügyetlenül mászkál a tengerparton. A rozmár megáll egy pillanatra, és egy ismerős nőstényről álmodik. A rozmár alszik, és csodálatos álmot lát. ''''

Javascript példa

Példa az állapotok állapotának megváltoztatására.

Forrásszöveg javascriptben // "interfész" állapot function Állapot () { this . someMethod = függvény () { }; ezt . nextState = függvény () { }; } // állapot megvalósítás // első állapotfüggvény StateA ( widjet ) { var duplicate = this ; // hivatkozás a példányosított objektumra (mert ez változhat) ezt . someMethod = function () { alert ( "StateA.someMethod" ); másodpéldány . nextState (); }; ezt . nextState = function () { alert ( "StateA > StateB" ); widget . onNextState ( new StateB ( widjet ) ); }; } ÁllapotA . prototípus = új állapot (); államA . prototípus . konstruktor = StateA ; // második állapotfüggvény StateB ( widjet ) { var duplicate = this ; ezt . someMethod = function () { alert ( "StateB.someMethod" ); másodpéldány . nextState (); }; ezt . nextState = function () { alert ( "StateB > StateA" ); widget . onNextState ( new StateA ( widjet ) ); }; } ÁllapotB . prototípus = új állapot (); ÁllapotB . prototípus . konstruktor = StateB ; // Widget "interfész" function Widget () { this . someMethod = függvény () { }; ezt . onNextState = function ( állapot ) { }; } // Widget megvalósítás function Widget1 () { var state = new StateA ( this ); ezt . someMethod = function () { állapot . valami módszer (); }; ezt . onNextState = function ( newState ) { state = newState ; }; } Widget1 . prototípus = új widget (); Widget1 . prototípus . konstruktor = Widget1 ; // használat var widget = new Widget1 (); widget . valami módszer (); // StateA.someMethod // StateA > StateB widget . valami módszer (); // StateB.someMethod // ÁllapotB > ÁllapotA

Állapotok megváltoztatása a Widget metódusának meghívásával (a cikk angol változatából).

Forrásszöveg javascriptben // "interfész" állapot function AbstractTool () { this . mozogTo = függvény ( x , y ) { }; ezt . mouseDown = függvény ( x , y ) { }; ezt . mouseUp = függvény ( x , y ) { }; } // állapot megvalósítás // ceruza eszköz funkció PenTool ( widjet ) { var duplicate = this ; // hivatkozás a példányosított objektumra (mert ez változhat) var mouseIsDown = false ; // az egérgomb jelenleg nincs lenyomva var lastCoords = []; // az egérkurzor múltbeli koordinátái ezt . moveTo = function ( x , y ) { if ( mouseIsDown && lastCoords . long ) { drawLine ( lastCoords , [ x , y ]); } lastCoords = [ x , y ]; }; ezt . mouseDown = function ( x , y ) { mouseIsDown = igaz ; lastCoords = [ x , y ]; }; ezt . mouseUp = function ( x , y ) { mouseIsDown = false ; }; function drawLine ( coords1 , coords2 ) { alert ( "drawLine: [" + coords1 [ 0 ] + ", " + coords1 [ 1 ] + "] - [" + coords2 [ 0 ] + ", " + coords2 [ 1 ] + "]" ); } } PenTool . prototípus = new AbstractTool (); pentool . prototípus . konstruktor = PenTool ; // kiválasztó eszköz függvény SelectionTool ( widget ) { var duplicate = this ; // hivatkozás a példányosított objektumra (mert ez változhat) var mouseIsDown = false ; // az egérgomb jelenleg nincs lenyomva var startCoords = []; // az egérkurzor koordinátái, amikor a gombra kattintanak ezt . moveTo = function ( x , y ) { if ( mouseIsDown ) { setSelection ( startCoords , [ x , y ]); } }; ezt . mouseDown = function ( x , y ) { startCoords = [ x , y ]; mouseIsDown = igaz ; }; ezt . mouseUp = function ( x , y ) { mouseIsDown = false ; }; function setSelection ( coords1 , coords2 ) { alert ( "setSelection: [" + coords1 [ 0 ] + ", " + coords1 [ 1 ] + "] - [" + coords2 [ 0 ] + ", " + coords2 [ 1 ] + "]" ); } }; Kiválasztó eszköz . prototípus = new AbstractTool (); Kiválasztó eszköz . prototípus . konstruktor = SelectionTool ; // Widget megvalósítás function DrawingController () { var currentTool = new SelectionTool (); // aktív eszköz ezt . moveTo = function ( x , y ) { currentTool . mozogTo ( x , y ); }; ezt . mouseDown = function ( x , y ) { currentTool . mouseDown ( x , y ); }; ezt . mouseUp = function ( x , y ) { currentTool . mouseUp ( x , y ); }; ezt . selectPenTool = function () { // a területkiválasztó eszköz kiválasztása currentTool = new PenTool (); }; ezt . selectSelectionTool = function () { // ceruzaeszköz kiválasztása currentTool = new SelectionTool (); }; } var widget = new DrawingController (); widget . egérrel lefelé ( 1 , 1 ); widget . mozogTo ( 1 , 2 ); // setSelection: [1, 1] - [1, 2] widget . mozogTo ( 1 , 3 ); // setSelection: [1, 1] - [1, 3] widget . mouseUp ( 1 , 3 ); widget . mozogTo ( 1 , 4 ); widget . selectPenTool (); widget . egérrel lefelé ( 1 , 1 ); widget . mozogTo ( 1 , 2 ); // DrawLine: [1, 1] - [1, 2] widget . mozogTo ( 1 , 3 ); // DrawLine: [1, 2] - [1, 3] widget . mouseUp ( 1 , 3 ); widget . mozogTo ( 1 , 4 );

CoffeeScript példa

Forrásszöveg CoffeeScript nyelven # Absztrakt osztály osztály Eszköz mouseUp : -> mouseDown : -> mouseMove : -> # Konkrét állapotok osztálya PenTool kiterjeszti Tool mouseDown : (e) -> @start = x : e . coors . x y : e . coors . y mouseUp : (e) -> new Shapes . Sor ( @start . x , @start . y , e . coors . x , e . coors . y ) osztály ZoomTool kiterjeszti Tool maxZoom = 5 minZoom = 0,5 delta = 0,5 konstruktor : -> @zoom = 1 mouseDown : (e) -> ha e . shiftKey @zoom -= delta , hacsak nem @zoom - minZoom < delta else @zoom += delta hacsak nem maxZoom - @zoom < delta # Widget osztály DrawingController # private getCoords = (elem, esemény) -> box = elem . getBoundingClientRect () x: Matek . forduló ( esemény . kliensX - box . balra ) y : Math . kerek ( esemény . kliens - doboz . tetejére ) # nyilvános konstruktor : (@canvas) -> @penTool = új PenTool @zoomTool = új ZoomTool @currentTool = @penTool # alapértelmezett eszköz # Egér eseménykezelő gyári kezelő = (type) => (e) => e.coors = getCoords ( @canvas , e ) @currentTool [ 'egér' + típus ]( e ) e . preventDefault () # Akassza fel a vászonkezelőket . addEventListener ( 'egér' , kezelő ( 'Fel' ), off ) vászon . addEventListener ( 'mousedown' , handler ( 'Down' ), off ) canvas . addEventListener ( 'mousemove' , handler ( 'Move' ), off ) selectPenTool : -> @currentTool = @penTool selectZoomTool : -> @currentTool = @zoomTool

VB.NET példa

Sablon alkalmazása

Forrásszöveg VB.NET nyelven Névtér Digital_Patterns.Behavioral.State Nyilvános interfész IAutomatState függvény GotApplication () mint [ String ] Funkció CheckApplication () As [ String ] Function RentApartment () As [ String ] Function DispenseKeys () As [ String ] End Interface Nyilvános felület IAutomat Sub GotApplication () Al CheckApplication () Sub RentApartment () Sub SetState ( ByVal s As IAutomatState ) függvény GetWaitingState () As IAutomatState függvény GetGotApplicationState () As IAutomatState függvény GetApartmentRentedState () As IAutomatState függvény GetFullyRented IAutomatState ( ) Tulajdonságszám ( ) Int32 végfelületként _ _ Public Class Automat implementálja az IAutomat Private _waitingState As IAutomatState Private _gotApplicationState As IAutomatState Private _apartmentRentedState As IAutomatState Private _fullRentedState As IAutomatState Private _state As IAutomatState Private _count _ _ Public Sub New ( ByVal n As Int32 ) _count = n _waitingState = New WaitingState ( én ) _gotApplicationState = New GotApplicationState ( én ) _apartmentRentedState = Új lakásRentedState ( én ) _fullS_New_RentedStateed = Vége _ _ _ _ _ _ _ _ _ Public Sub GotApplication () Az IAutomat megvalósítása . GotApplicationConsole . _ WriteLine ( _state.GotApplication ( ) ) End Sub Public Sub CheckApplication () Az IAutomat megvalósítása . CheckApplication Console . WriteLine ( _state . CheckApplication ()) End Sub Public Sub RentApartment () Az IAutomat megvalósítása . RentApartment Console . WriteLine ( _state . RentApartment ()) Console . WriteLine ( _state . DispenseKeys ()) End Sub Public Sub SetState ( ByVal s As IAutomatState ) Az IAutomat megvalósítása . SetState _state = s End Sub Nyilvános függvény GetWaitingState () Ahogy az IAutomatState megvalósítja az IAutomatot . GetWaitingState Return _waitingState End Function Nyilvános függvény GetGotApplicationState () Ahogy az IAutomatState implementálja az IAutomatot . GetGotApplicationState Return _gotApplicationState End Function Nyilvános funkció GetApartmentRentedState () As IAutomatState implementálja az IAutomatot . GetApartmentRentedState Return _apartmentRentedState Végfüggvény _ Nyilvános függvény GetFullyRentedState () As IAutomatState implementálja az IAutomat . GetFullyRentedState Return _fullRentedState végfüggvény _ Public Property Count () As Integer Implements IAutomat . Count Get Return _count End Get Set ( ByVal érték As Integer ) _count = érték Vége Beállítás Vége Tulajdonság záró osztály A Public Class WaitingState az IAutomatState Private _automat funkciót automataként valósítja meg Public Sub New ( ByVal automat As Automat ) _automat = automat End Sub Nyilvános függvény GotApplication () As [ String ] implementálja az IAutomatState-et . GotApplication_automat . _ SetState ( _automat . GetGotApplicationState ()) " Köszönjük az alkalmazást." végfunkció _ Public Function CheckApplication () As [ String ] ként valósítja meg az IAutomatState-et . CheckApplication Return "Jelentkezést kell benyújtania." végfunkció _ Public Function RentApartment () As [ String ] Implements IAutomatState . RentApartment Return "Jelentkezést kell benyújtania." végfunkció _ Public Function DispenseKeys () As [ String ] Az IAutomatState megvalósítása . DispenseKeys Return "Kérelmet kell benyújtania." Vége funkció Végosztály _ Public Class GotApplicationState implementálja az IAutomatState Private _automat Automatikus Private Csak olvasható _random As Random Public Sub New ( ByVal automat As Automat ) _automat = automat _random = Új véletlenszerű ( System . DateTime . Now . Milliszekundum ) End Sub Nyilvános függvény GotApplication () As [ String ] implementálja az IAutomatState-et . GotApplication Return "Már megkaptuk a jelentkezését." végfunkció _ Public Function CheckApplication () As [ String ] ként valósítja meg az IAutomatState-et . CheckApplication Dim yesNo = _random . [ Következő ] () 10. mód Ha igenNem > 4 És szintén _automat . Számlálás > 0 Majd _automat . SetState ( _automat . GetApartmentRentedState ()) Return "Gratulálunk, jóváhagyták." Egyéb _automatikus . SetState ( _automat . GetWaitingState ()) Return "Sajnáljuk, nem hagyták jóvá." End If End Funkció Public Function RentApartment () As [ String ] Implements IAutomatState . RentApartment Return "Ellenőriznie kell a jelentkezését." végfunkció _ Public Function DispenseKeys () As [ String ] Az IAutomatState megvalósítása . DispenseKeys Return "Ellenőriznie kell az alkalmazást." Vége funkció Végosztály _ Public Class ApartmentRentedState Az IAutomatState Private _automat automataként valósítja meg Public Sub New ( ByVal automat As Automat ) _automat = automat End Sub Nyilvános függvény GotApplication () As [ String ] implementálja az IAutomatState-et . GotApplication Return "Várjon, bérelünk Önnek egy lakást." végfunkció _ Public Function CheckApplication () As [ String ] ként valósítja meg az IAutomatState-et . CheckApplication Return "Várjon, bérelünk Önnek egy lakást." végfunkció _ Public Function RentApartment () As [ String ] Implements IAutomatState . RentApartment _automat . Count = _automat . Count - 1 Return "Bérbeadás önnek egy lakást...." Vége funkció Public Function DispenseKeys () As [ String ] Az IAutomatState megvalósítása . DispenseKeys Ha _automat . Számlálás <= 0 Majd _automat . SetState ( _automat . GetFullyRentedState ()) Else _automat . SetState ( _automat . GetWaitingState ()) End If Return "Itt vannak a kulcsai!" Vége funkció Végosztály _ Public Class FullyRentedState implementálja az IAutomatState Private _automat mint automatát Public Sub New ( ByVal automat As Automat ) _automat = automat End Sub Nyilvános függvény GotApplication () As [ String ] implementálja az IAutomatState-et . GotApplication Return "Sajnáljuk, teljesen ki vagyunk bérelve." végfunkció _ Public Function CheckApplication () As [ String ] ként valósítja meg az IAutomatState-et . CheckApplication Return "Sajnáljuk, teljesen ki vagyunk bérelve." végfunkció _ Public Function RentApartment () As [ String ] Implements IAutomatState . RentApartment Return "Sajnáljuk, teljesen ki vagyunk bérelve." végfunkció _ Public Function DispenseKeys () As [ String ] Az IAutomatState megvalósítása . DispenseKeys Return "Sajnáljuk, teljesen ki vagyunk bérelve." Vége funkció Végosztály _ Osztály Program Megosztott al - () Dim automata = Új automata ( 9 ) automata . GotApplication () automat . CheckApplication () automat . bérelhető apartman () Konzol . Olvasás () End Sub End Class End névtér

Ugyanez a példa, a sablon alkalmazása nélkül

Forrásszöveg VB.NET nyelven Névtér Digital_Patterns.Behavioral.State Nyilvános enum állapota TELJES_BÉRLETETT = 0 VÁRAKOZÁS = 1 GOT_APPLICATION = 2 APARTMENT_BÉRLETES = 3 Befejezési adat Public Class RentalMethods Csak olvasható privát _random As Random Private _numberApartments As Int32 Private _state As State = állam . VÁRAKOZÁS Public Sub New ( ByVal n As Int32 ) _numberApartments = n _random = Új véletlenszerű ( System . Date Time . Now . Milliszekundum ) End Sub Public Sub GetApplication () Válassza a Case _state Case State lehetőséget . FULLY_RENTED konzol . WriteLine ( "Sajnáljuk, teljesen ki vagyunk bérelve." ) Kilépés Válassza az eset állapotát . WAITING_state = Állam _ _ GOT_APPLICATION konzol . WriteLine ( "Köszönjük a jelentkezést." ) Kilépés Válassza az eset állapotát . GOT_APPLICATION konzol . WriteLine ( "Már megkaptuk a jelentkezését." ) Kilépés Válassza az eset állapotát . APARTMENT_RENTED Konzol . WriteLine ( "Várjon, bérelünk Önnek egy lakást." ) Kilépés Kiválasztás Vége Kiválasztás Vége Sub Nyilvános alellenőrzési alkalmazás () Dim yesNo = _random . [ Következő ] () 10. mód Válassza a Case _state Case State lehetőséget . FULLY_RENTED konzol . WriteLine ( "Sajnáljuk, teljesen ki vagyunk bérelve." ) Kilépés Válassza az eset állapotát . VÁRAKOZÓ konzol . WriteLine ( "Jelentkezést kell benyújtania." ) Kilépés Válassza az eset állapotát . GOT_APPLICATION Ha igenNem > 4 És _számApartments > 0 Akkor Konzol . WriteLine ( "Gratulálunk, jóváhagyták." ) _state = Állapot . APARTMENT_RENTED RentApartment () Else Console . WriteLine ( "Sajnos nem hagyták jóvá." ) _state = Állapot . VÁRAKOZÁS Vége Ha kilépés Válassza az eset állapotát . APARTMENT_RENTED Konzol . WriteLine ( "Várjon, bérelünk Önnek egy lakást." ) Kilépés Kiválasztás Vége Kiválasztás Vége Sub Public Sub RentApartment () Válassza a Case _state Case State lehetőséget . FULLY_RENTED konzol . WriteLine ( "Sajnáljuk, teljesen ki vagyunk bérelve." ) Kilépés Válassza az eset állapotát . VÁRAKOZÓ konzol . WriteLine ( "Jelentkezést kell benyújtania." ) Kilépés Válassza az eset állapotát . GOT_APPLICATION konzol . WriteLine ( "Ellenőriznie kell az alkalmazást." ) Kilépés Válassza az eset állapotát . APARTMENT_RENTED Konzol . WriteLine ( "Bérelünk egy lakást...." ) _numberApartments -= 1 DispenseKeys () Kilépés Kiválasztás Vége Kiválasztás vége al Public Sub DispenseKeys () Válassza a Case _state Case State lehetőséget . FULLY_RENTED konzol . WriteLine ( "Sajnáljuk, teljesen ki vagyunk bérelve." ) Kilépés Válassza az eset állapotát . VÁRAKOZÓ konzol . WriteLine ( "Jelentkezést kell benyújtania." ) Kilépés Válassza az eset állapotát . GOT_APPLICATION konzol . WriteLine ( "Ellenőriznie kell az alkalmazást." ) Kilépés Válassza az eset állapotát . APARTMENT_RENTED Konzol . WriteLine ( "Itt vannak a kulcsaid!" ) _state = Állapot . VÁRAKOZÁS Kilépés Kiválasztás Vége Kiválasztás End Sub End Class osztály programja Megosztott al - () Dim rentalMethods = New RentalMethods ( 9 ) bérleti módszerek . GetApplication () rentalMethods . CheckApplication () rentalMethods . BérlésApartment () bérlésMódszerek . DispenseKeys () Konzol . Olvassa el () End Sub End Class End névtér


PHP5 példa

Forrásszöveg php5 nyelven <?php /** * Az állapotminta azt szabályozza, hogy az objektum viselkedése hogyan változik meg, ha belső állapota megváltozik. * Külsőleg úgy tűnik, hogy az objektum megváltoztatja az osztályát. */ névtér állapot1 { class Client { public function __construct () { $context = new Context (); $kontextus -> kérés (); $kontextus -> kérés (); $kontextus -> kérés (); $kontextus -> kérés (); $kontextus -> kérés (); $kontextus -> kérés (); } } class Teszt { public static function go () { $kliens = new Client (); } } /** * Osztály több belső állapottal */ class Context { /** * @var ASTate */ public $state ; const STATE_A = 1 ; const STATE_B = 2 ; const STATE_C = 3 ; public function __construct () { $this -> setState ( Context :: STATE_A ); } /** * A környezeti műveletek állapotobjektumokra vannak delegálva feldolgozásra */ public function request () { $this -> state -> handle (); } /** * Ez az állapotváltás megvalósításának egyik módja * @param $state a kiválasztott állapot, a lehetséges opciók az állandók listájában vannak felsorolva Context::STATE_.. */ public function setState ( $state ) { if ( $ state == Context :: STATE_A ) { $this -> state = new ConcreteStateA ( $this ); } elseif ( $állapot == Kontextus :: ÁLLAPOT_B ) { $this -> state = new ConcreteStateB ( $this ); } elseif ( $state == Context :: STATE_C ) { $this -> state = new ConcreteStateC ( $this ); } } } /** * Közös interfész minden konkrét állapothoz. * Minden állapot ugyanazt az interfészt valósítja meg, ezért felcserélhető. */ class AState { /** * @var Context hivatkozást tárol a kontextusra a kényelmes állapotváltás érdekében */ védett $context ; public function __construct ( $kontextus ) { $this -> context = $context ; } /** * A feldolgozás a különböző állapotokban eltérő lehet. * Ha az ASTate nem csak egy interfész, hanem egy absztrakt osztály, * akkor tartalmazhat szabványos feldolgozást, akkor a konkrét állapotok osztályai csak a szabványos viselkedésre vonatkozó jellemzőiket írják le. */ public function handle () { echo " \n standard hand" ; } } /** * Ezután jön egy sor speciális állapot, amely feldolgozza a kontextusból érkező kéréseket. * Minden osztály rendelkezik saját kérés megvalósításával. * Így amikor a Context objektum másik állapotba kerül, a viselkedése is megváltozik. */ class ConcreteStateA expands AState { public function handle () { echo " \n State A handle" ; // állapotváltás $this -> context -> setState ( Context :: STATE_B ); } } class ConcreteStateB expands AState { public function handle () { echo " \n State B handle" ; // állapotváltás $this -> context -> setState ( Context :: STATE_C ); } } class ConcreteStateC expands AState { public function handle () { echo " \n State C handel" ; // állapotváltás $this -> context -> setState ( Context :: STATE_A ); } } teszt :: megy (); } Példa egy automatára a php5-ben található fejjel mintákból <?php /** * Egy konkrétabb példa az "Állapot" mintán alapul. * Az állapotminta azt szabályozza, hogy az objektum viselkedése hogyan változik meg, ha belső állapota megváltozik. * Külsőleg úgy tűnik, hogy az objektum megváltoztatja az osztályát. */ névtér állapot2 { class Client { public function __construct () { $context = new Context (); $context -> dispense (); $context -> insertQuarter (); $kontextus -> turnCrank (); $context -> insertQuarter (); $kontextus -> turnCrank (); $context -> insertQuarter (); $kontextus -> turnCrank (); } } class Teszt { public static function go () { $kliens = new Client (); } } /** * Osztály több belső állapottal */ class Context { /** * @var ASTate */ public $state ; /** * Lehetséges állapotok */ const STATE_SOLD_OUT = 1 ; const ÁLLAPOT_NO_NEGYEDÁLLAPOT = 2 ; const STATE_HAS_QUARTER_STATE = 3 ; const STATE_SOLD_STATE = 4 ; const ÁLLAPOT_GYŐZTES_ÁLLAPOT = 5 ; /** * @var int Mennyi gumi van a gépben? */ nyilvános $count = 2 ; public function __construct () { $this -> setState ( Context :: STATE_NO_QUARTER_STATE ); } /** * A környezeti műveletek állapotobjektumokra vannak delegálva feldolgozásra */ public function insertQuarter () { $this -> state -> insertQuarter (); } public function ejectQuarter () { $this -> state -> ejectQuarter (); } public function turnCrank () { $this -> state -> turnCrank (); $this -> state -> dispense (); } public function dispense () { $this -> state -> dispense (); } /** * Ez az állapotváltás megvalósításának egyik módja * @param $state a kiválasztott állapot, a lehetséges opciók az állandók listájában vannak felsorolva Context::STATE_.. */ public function setState ( $state ) { if ( $ state == Context :: STATE_SOLD_OUT ) { $this -> state = new ConcreteStateSoldOut ( $this ); } elseif ( $állapot == Context :: STATE_NO_QUARTER_STATE ) { $this -> state = new ConcreteStateNoQuarter ( $this ); } elseif ( $állapot == Context :: STATE_HAS_QUARTER_STATE ) { $this -> state = new ConcreteStateHasQuarter ( $this ); } elseif ( $state == Context :: STATE_SOLD_STATE ) { $this -> state = new ConcreteStateSoldState ( $this ); } elseif ( $állapot == Context :: STATE_WINNER_STATE ) { $this -> state = new ConcreteStateWinnerState ( $this ); } } public function releaseBall () { if ( $this -> count > 0 ) { echo "A labda felszabadul" ; $this -> count -= 1 ; } else { echo "Nincs elengedhető golyó :(" ; } } } /** * Közös interfész minden konkrét állapothoz. * Minden állapot ugyanazt az interfészt valósítja meg, ezért felcserélhető. */ class AState { /** * @var Context hivatkozást tárol a kontextusra a kényelmes állapotváltás érdekében */ védett $context ; public function __construct ( & $context ) { $this -> context =& $context ; } /** * A feldolgozás a különböző állapotokban eltérő lehet. * Ha az ASTate nem csak egy interfész, hanem egy absztrakt osztály, * akkor tartalmazhat szabványos feldolgozást, akkor a konkrét állapotok osztályai csak a szabványos viselkedésre vonatkozó jellemzőiket írják le. */ public function insertQuarter () { echo " \n lol, ezt nem tudod megtenni" ; } public function ejectQuarter () { echo " \n lol, ezt nem tudod megtenni" ; } public function turnCrank () { echo " \n lol, ezt nem tudod megtenni" ; } public function dispense () { echo " \n lol, ezt nem tudod megtenni" ; } } /** * Ezután jön egy sor speciális állapot, amely feldolgozza a kontextusból érkező kéréseket. * Minden osztály rendelkezik saját kérés megvalósításával. * Így amikor a Context objektum másik állapotba kerül, a viselkedése is megváltozik. */ class ConcreteStateSoldOut kiterjeszti az AState { public function insertQuarter () { echo " \n sajnálom, elfogytam, nem bírom a negyedet" ; } } class ConcreteStateNoQuarter kiterjeszti az AState { public function insertQuarter () { echo " \n negyedet kapott, igen!" ; // állapot váltása $this -> context -> setState ( Context :: STATE_HAS_QUARTER_STATE ); } } class ConcreteStateHasQuarter expands AState { public function ejectQuarter () { echo " \n vegye vissza a pénzét" ; // állapot váltása $this -> context -> setState ( Context :: STATE_NO_QUARTER_STATE ); } public function turnCrank () { echo " \n megfordultál" ; $győztes = rand ( 1 , 10 ) == 10 ? 1 : 0 ; if ( $győztes ) { $this -> context -> setState ( Context :: STATE_WINNER_STATE ); } else { $this -> context -> setState ( Context :: STATE_SOLD_STATE ); } } } class ConcreteStateSoldState kiterjeszti az AState { public function dispense () { echo " \n dispensing , yeah!" ; $this -> context -> releaseBall (); if ( $this -> context -> count == 0 ) { $this -> context -> setState ( Context :: STATE_SOLD_OUT ); } else { // állapotváltás $this -> context -> setState ( Context :: STATE_NO_QUARTER_STATE ); } } } class ConcreteStateWinnerState kiterjeszti az AState { public function dispense () { echo " \n dispensing , yeah!" ; $this -> context -> releaseBall (); if ( $this -> context -> count == 0 ) { $this -> context -> setState ( Context :: STATE_SOLD_OUT ); } else { echo " \n ps te vagy a GYŐZTES, kapsz plusz labdát!" ; $this -> context -> releaseBall (); if ( $this -> context -> count == 0 ) { $this -> context -> setState ( Context :: STATE_SOLD_OUT ); } else { $this -> context -> setState ( Context :: STATE_NO_QUARTER_STATE ); } } } } teszt :: megy (); }