State
Situace
V systému se nachází třída, jejíž chování je velmi silně závislé
na jejím vnitřním stavu. Zbytek systému má být od tohoto stavu
odstíněn.
Problém
Typická špatná implementace tohoto chování se opírá o množství
podmínek, jejichž údržba je obtížná. Všechny stavy třídy jsou
smíchané dohromady, i když by správně měly být odděleny.
Řešení
Na základě vnitřních stavů se vytvoří hiearchie tříd, které
implementují společné rozhraní. Do třídy, která tento vnitřní stav
obsahuje, bude obsahovat proměnnou, obsahující právě jednu instanci třídy
z této hiearchie, tedy vnitřní stav. Všechny metody, které závisí na
vnitřním stavu, jsou na tento stav delegovány.
Změna vnitřního stavu se provádí výměnou objektu, který představuje
vnitřní stav.
Varianty
- změny vnitřního stavu provádí ostatní třídy
- vnitřní stav mění třída sama
- změna vnitřního stavu probíhá automaticky na základě hodnot
vstupních parametrů
UML diagramy
Související vzory
- Strategy – konkrétní
strategii určuje klient
Příklad
Následuje jednoduchý příklad implementace tohoto vzoru v programovacím jazyce Java.
Vnitřní stavy
kód v jazyce Java - Zobrazit
-
/**
-
* Nálada (obecný vnitřní
stav).
-
*
-
* @author Vojtěch
Hordějčuk
-
*/
-
public interface StateOfMind
-
{
-
/**
-
* Vyjádří daný
pocit.
-
*/
-
public void express();
-
}
-
-
/**
-
* Pocit štěstí (konkrétní
vnitřní stav).
-
*
-
* @author Vojtěch
Hordějčuk
-
*/
-
public class
HappyState implements StateOfMind
-
{
-
@Override
-
public void express()
-
{
-
System.out.println("Jsem veselý
:)");
-
}
-
}
-
-
/**
-
* Pocit smutku (konkrétní
vnitřní stav).
-
*
-
* @author Vojtěch
Hordějčuk
-
*/
-
public class
SadState implements StateOfMind
-
{
-
@Override
-
public void express()
-
{
-
System.out.println("Jsem smutný
:(");
-
}
-
}
Kontext
Kontext je třída, jejíž stav je reprezentován instancí nějakého
vnitřního stavu.
kód v jazyce Java - Zobrazit
-
/**
-
* Třída s vnitřním
stavem.
-
*
-
* @author Vojtěch
Hordějčuk
-
*/
-
public class
Context
-
{
-
/**
-
* aktuální
pocit
-
*/
-
private StateOfMind
state;
-
-
/**
-
* Vytvoří novou
instanci.
-
*/
-
public Context()
-
{
-
this.state = new HappyState();
-
}
-
-
/**
-
* Vyjádří daný
pocit.
-
*/
-
public void express()
-
{
-
System.out.println("Nyní vyjádřím svůj
pocit.");
-
state.express();
-
}
-
-
/**
-
* Nastaví první
stav.
-
*/
-
public void beHappy()
-
{
-
System.out.println("Teď budu
veselý.");
-
this.state = new HappyState();
-
}
-
-
/**
-
* Nastaví druhý
stav.
-
*/
-
public void beSad()
-
{
-
System.out.println("Teď budu
smutný.");
-
this.state = new SadState();
-
}
-
}
Test
kód v jazyce Java - Zobrazit
-
public static
void main(String[] args)
-
{
-
// vytvořit kontext
-
-
Context context = new Context();
-
-
// nastavit první stav
(štěstí)
-
-
context.beHappy();
-
context.express();
-
-
// nastavit druhý stav
(smutek)
-
-
context.beSad();
-
context.express();
-
}
Reference