Kujundusmuster on mall, mis lahendab tarkvara kujundamisel sageli korduva probleemi.
Olekumuster on käitumismuster, mis võimaldab objektil muuta oma käitumist, kui selle sisemine olek muutub.
Siit saate teada, kuidas TypeScriptis olekumustrit kasutada.
Mis on riigi muster?
Oleku kujundamise muster on tihedalt seotud lõpliku olekuga masinaga, mis kirjeldab programmi, mis eksisteerib lõplik olekute arv igal ajahetkel ja käitub igas olekus erinevalt.
On piiratud, ettemääratud reeglid – üleminekud –, mis reguleerivad teisi olekuid, millele iga olek võib lülituda.
Kui kliendi ostutellimus on veebipoes „tarnitud”, ei saa seda „tühistada”, kuna see on juba „tarnitud”. „Tarnitud” ja „Tühistatud” on tellimuse piiratud olekud ja tellimus käitub olenevalt selle olekust erinevalt.
Riigi muster loob klassi iga võimaliku oleku jaoks, kusjuures igas klassis sisaldub olekuspetsiifiline käitumine.
Olekupõhise rakenduse näide
Oletame näiteks, et loote rakendust, mis jälgib kirjastusettevõtte artikli olekuid. Artikkel võib olla kinnitamise ootel, kirjaniku koostatud, toimetaja redigeeritud või avaldatud. Need on avaldatava artikli lõplikud olekud; igas ainulaadses olekus käitub artikkel erinevalt.
Artiklirakenduse erinevaid olekuid ja üleminekuid saate visualiseerida alloleva olekudiagrammi abil:
Selle stsenaariumi rakendamisel koodis peate esmalt deklareerima artikli liidese:
liidesArtikli liides{
pitch (): tühine;
mustand(): tühine;
muuda (): tühine;
avalda (): tühine;
}
Sellel liidesel on kõik rakenduse võimalikud olekud.
Järgmisena looge rakendus, mis rakendab kõiki liidese meetodeid:
// Rakendus
klassArtikkelrakendabArtikli liides{
konstruktor() {
see.showCurrentState();
}privaatnenäita CurrentState'i(): tühine{
//...
}avalikhelikõrgus(): tühine{
//...
}avalikmustand(): tühine{
//...
}avalikmuuda(): tühine{
//...
}
avalikavaldada(): tühine{
//...
}
}
Eramees näita CurrentState'i meetod on kasulik meetod. See õpetus kasutab seda igas osariigis toimuva näitamiseks. See ei ole olekumustri kohustuslik osa.
Olekuüleminekute käsitlemine
Järgmisena peate tegelema olekuüleminekutega. Oleku ülemineku käsitlemine teie rakendusklassis nõuaks palju tingimuslikud väited. See tooks kaasa korduva koodi, mida on raskem lugeda ja hooldada. Selle probleemi lahendamiseks saate delegeerida iga oleku üleminekuloogika oma klassile.
Enne iga olekuklassi kirjutamist peaksite looma abstraktse baasklassi, et kõik vales olekus kutsutud meetodid tekitaksid vea.
Näiteks:
abstraktneklassArtikkelRiikrakendabArtikli liides{
pitch(): ArtikkelState {
viskamauusViga("Vigane toiming: ülesannet ei saa täita sisse hetkeseis");
}draft(): ArtikkelState {
viskamauusViga("Vigane toiming: ülesannet ei saa täita sisse hetkeseis");
}edit(): ArtikkelState {
viskamauusViga("Vigane toiming: ülesannet ei saa täita sisse hetkeseis");
}
avalda(): ArtikkelState {
viskamauusViga("Vigane toiming: ülesannet ei saa täita sisse hetkeseis");
}
}
Ülaltoodud põhiklassis annab iga meetod vea. Nüüd peate iga meetodi alistama, luues konkreetsed klassid, mis ulatub iga osariigi baasklass. Iga konkreetne klass sisaldab olekuspetsiifilist loogikat.
Igal rakendusel on jõudeolek, mis käivitab rakenduse. Selle rakenduse jõudeolek seab rakenduse olekusse mustand olek.
Näiteks:
klassOotel mustandi olekulatubArtikkelRiik{
pitch(): ArtikkelState {
tagasiuus DraftState();
}
}
The helikõrgus ülaltoodud klassi meetod initsialiseerib rakenduse, määrates praeguseks olekuks DraftState.
Järgmisena alistage ülejäänud meetodid, näiteks:
klassDraftStateulatubArtikkelRiik{
draft(): ArtikkelState {
tagasiuus RedigeerimineState();
}
}
See kood alistab mustand meetod ja tagastab eksemplari Redigeerimise olek.
klassRedigeerimise olekulatubArtikkelRiik{
edit(): ArtikkelState {
tagasiuus PublishedState();
}
}
Ülaltoodud koodiplokk alistab muuda meetod ja tagastab eksemplari Avaldatud osariik.
klassAvaldatud osariikulatubArtikkelRiik{
avalda(): ArtikkelState {
tagasiuus PendingDraftState();
}
}
Ülaltoodud koodiplokk alistab avaldada meetod ja paneb rakenduse tagasi jõudeolekusse, Ootel mustandi olek.
Seejärel peate lubama rakendusel oma olekut sisemiselt muuta, viidates praegusele olekule privaatse muutuja kaudu. Seda saate teha, lähtestades oma rakendusklassis jõudeoleku ja salvestades väärtuse privaatsesse muutujasse:
privaatne olek: ArtikkelState = uus PendingDraftState();
Järgmisena värskendage näita CurrentState'i meetod praeguse oleku väärtuse printimiseks:
privaatnenäita CurrentState'i(): tühine{
konsool.log(see.state);
}
The näita CurrentState'i meetod logib konsooli rakenduse praeguse oleku.
Lõpuks määrake privaatne muutuja iga rakenduse meetodi praeguse oleku eksemplarile.
Näiteks värskendage oma rakendusi helikõrgus meetod allolevasse koodiplokki:
avalikhelikõrgus(): tühine{
see.state = see.state.pitch();
see.showCurrentState();
}
Ülaltoodud koodiplokis on helikõrgus meetod muudab oleku praegusest olekust helikõrguse olekusse.
Samamoodi muudavad kõik muud meetodid oleku praegusest rakenduse olekust vastavatele olekutele.
Värskendage oma rakendusmeetodeid allolevatele koodiplokkidele:
The mustand meetod:
avalikmustand(): tühine{
see.state = see.state.draft();
see.showCurrentState();
}
The muuda meetod:
avalikmuuda(): tühine{
see.state = see.state.edit();
see.showCurrentState();
}
Ja avaldada meetod:
avalikavaldada(): tühine{
see.state = see.state.publish();
see.showCurrentState();
}
Valmis rakenduse kasutamine
Teie valmis rakendusklass peaks olema sarnane allolevale koodiplokile:
// Rakendus
klassArtikkelrakendabArtikli liides{
privaatne olek: ArtikkelState = uus PendingDraftState();konstruktor() {
see.showCurrentState();
}privaatnenäita CurrentState'i(): tühine{
konsool.log(see.state);
}avalikhelikõrgus(): tühine{
see.state = see.state.pitch();
see.showCurrentState();
}avalikmustand(): tühine{
see.state = see.state.draft();
see.showCurrentState();
}avalikmuuda(): tühine{
see.state = see.state.edit();
see.showCurrentState();
}
avalikavaldada(): tühine{
see.state = see.state.publish();
see.showCurrentState();
}
}
Olekute üleminekuid saab testida, kutsudes meetodeid õiges järjestuses. Näiteks:
konst dokumendid = uus Artikkel(); // Ootel mustandi olek: {}
docs.pitch(); // Mustandi olek: {}
docs.draft(); // Redigeerimise olek: {}
docs.edit(); // Avaldatud olek: {}
docs.publish(); // Ootel mustandi olek: {}
Ülaltoodud koodiplokk töötab, kuna rakenduse olekud läksid ümber.
Kui proovite olekut muuta viisil, mis pole lubatud, näiteks helikõrguse olekust muutmisolekusse, kuvab rakendus veateate:
konst dokumendid = uus Artikkel(); // Ootel mustandi olek: {}
docs.pitch() // Mustandi olek: {}
docs.edit() // Kehtetu toiming: praeguses olekus ei saa ülesannet täita
Kasutage seda mustrit ainult siis, kui:
- Loote objekti, mis käitub olenevalt selle hetkeolekust erinevalt.
- Objektil on palju olekuid.
- Olekuspetsiifiline käitumine muutub sageli.
Riigi mustri eelised ja kompromissid
See muster välistab mahukad tingimuslaused ja säilitab ühtse vastutuse ja avatud/suletud põhimõtted. Kuid see võib olla üle jõu käiv, kui rakendusel on vähe olekuid või kui selle olekud pole eriti dünaamilised.