Dizaino modelis yra šablonas, kuris išsprendžia dažnai pasikartojančią programinės įrangos kūrimo problemą.
Būsenos modelis yra elgesio modelis, leidžiantis objektui keisti savo elgesį, kai pasikeičia jo vidinė būsena.
Čia sužinosite, kaip naudoti būsenos šabloną „TypeScript“.
Kas yra valstybės modelis?
Būsenos projektavimo modelis yra glaudžiai susijęs su baigtinių būsenų mašina, kuri apibūdina programą, egzistuojančią baigtinis būsenų skaičių bet kuriuo momentu ir kiekvienoje būsenoje elgiasi skirtingai.
Yra ribotos, iš anksto nustatytos taisyklės – perėjimai – kurios reguliuoja kitas būsenas, į kurias gali pereiti kiekviena būsena.
Kalbant apie kontekstą, internetinėje parduotuvėje, jei kliento apsipirkimo užsakymas buvo „pristatytas“, jo negalima „atšaukti“, nes jis jau buvo „pristatytas“. „Pristatyta“ ir „Atšaukta“ yra baigtinės užsakymo būsenos, o užsakymas elgsis skirtingai, atsižvelgiant į jo būseną.
Būsenos modelis sukuria klasę kiekvienai galimai būsenai, kiekvienoje klasėje esant specifinei būsenai.
Būsenos programos pavyzdys
Pavyzdžiui, tarkime, kad kuriate programą, kuri seka leidybos įmonės straipsnio būsenas. Straipsnis gali būti patvirtintas, parengtas rašytojo, redaguotas redaktoriaus arba paskelbtas. Tai yra baigtinės publikuojamo straipsnio būsenos; kiekvienoje unikalioje būsenoje straipsnis elgiasi skirtingai.
Galite vizualizuoti skirtingas straipsnio programos būsenas ir perėjimus naudodami toliau pateiktą būsenos diagramą:
Įdiegę šį scenarijų kode, pirmiausia turėtumėte deklaruoti straipsnio sąsają:
sąsajaStraipsnio sąsaja{
pitch (): tuštuma;
juodraštis (): tuštuma;
Redaguoti(): tuštuma;
publikuoti (): tuštuma;
}
Ši sąsaja turės visas galimas programos būsenas.
Tada sukurkite programą, kuri įgyvendina visus sąsajos metodus:
// Taikymas
klasėStraipsnispadargaiStraipsnio sąsaja{
konstruktorius() {
tai.showCurrentState();
}privatusparodytiCurrentState(): tuštuma{
//...
}viešaspikis(): tuštuma{
//...
}viešasjuodraštis(): tuštuma{
//...
}viešasRedaguoti(): tuštuma{
//...
}
viešaspaskelbti(): tuštuma{
//...
}
}
Privatus parodytiCurrentState metodas yra naudingumo metodas. Šiame vadove jis naudojamas parodyti, kas vyksta kiekvienoje būsenoje. Tai nėra būtina būsenos modelio dalis.
Būsenos perėjimų tvarkymas
Tada turėsite tvarkyti būsenos perėjimus. Norint valdyti būsenos perėjimą jūsų taikomųjų programų klasėje, reikės daug sąlyginiai teiginiai. Dėl to kodas pasikartotų, kurį sunkiau skaityti ir prižiūrėti. Norėdami išspręsti šią problemą, galite perduoti kiekvienos būsenos perėjimo logiką savo klasei.
Prieš rašydami kiekvieną būsenos klasę, turėtumėte sukurti abstrakčią bazinę klasę, kad įsitikintumėte, jog bet koks metodas, iškviestas esant netinkamai būsenai, sukels klaidą.
Pavyzdžiui:
abstrakčiaiklasėStraipsnisBūsenapadargaiStraipsnio sąsaja{
pitch(): ArticleState {
mestinaujasKlaida(„Netinkama operacija: negalima atlikti užduoties in dabartinė būsena“);
}draft(): ArticleState {
mestinaujasKlaida(„Netinkama operacija: negalima atlikti užduoties in dabartinė būsena“);
}edit(): ArticleState {
mestinaujasKlaida(„Netinkama operacija: negalima atlikti užduoties in dabartinė būsena“);
}
publikuoti(): ArticleState {
mestinaujasKlaida(„Netinkama operacija: negalima atlikti užduoties in dabartinė būsena“);
}
}
Aukščiau esančioje bazinėje klasėje kiekvienas metodas sukelia klaidą. Dabar turite nepaisyti kiekvieno metodo, sukurdami konkrečias klases tęsiasi kiekvienos valstybės bazinė klasė. Kiekvienoje konkrečioje klasėje bus konkrečios būsenos logika.
Kiekviena programa turi neaktyvumo būseną, kuri inicijuoja programą. Šios programos laukimo būsena nustatys programą į juodraštis valstybė.
Pavyzdžiui:
klasėLaukiama juodraščio būsenatęsiasiStraipsnisBūsena{
pitch(): ArticleState {
grąžintinaujas DraftState();
}
}
The pikis metodas aukščiau pateiktoje klasėje inicijuoja programą nustatydamas dabartinę būseną į DraftState.
Tada nepaisykite likusių metodų, pavyzdžiui:
klasėDraftStatetęsiasiStraipsnisBūsena{
draft(): ArticleState {
grąžintinaujas Redagavimo būsena();
}
}
Šis kodas nepaiso juodraštis metodą ir grąžina egzempliorių Redagavimo būsena.
klasėRedagavimo būsenatęsiasiStraipsnisBūsena{
edit(): ArticleState {
grąžintinaujas PaskelbtaState();
}
}
Aukščiau pateiktas kodo blokas nepaiso Redaguoti metodą ir grąžina egzempliorių Paskelbta valstybė.
klasėPaskelbta valstybėtęsiasiStraipsnisBūsena{
publikuoti(): ArticleState {
grąžintinaujas LaukiamaDraftState();
}
}
Aukščiau pateiktas kodo blokas nepaiso paskelbti metodą ir grąžina programą į laukimo būseną, Laukiama juodraščio būsena.
Tada turite leisti programai pakeisti savo būseną viduje, nurodant dabartinę būseną per privatų kintamąjį. Tai galite padaryti inicijuodami tuščiosios eigos būseną savo programos klasėje ir išsaugodami vertę privačiame kintamajame:
privatus būsena: straipsnisBūsena = naujas LaukiamaDraftState();
Tada atnaujinkite parodytiCurrentState Dabartinės būsenos vertės spausdinimo būdas:
privatusparodytiCurrentState(): tuštuma{
konsolė.log(tai.state);
}
The parodytiCurrentState metodas užregistruoja dabartinę programos būseną konsolėje.
Galiausiai iš naujo priskirkite privatų kintamąjį dabartinės būsenos egzemplioriui kiekviename iš programos metodų.
Pavyzdžiui, atnaujinkite programas pikis metodas į kodo bloką žemiau:
viešaspikis(): tuštuma{
tai.state = tai.state.pitch();
tai.showCurrentState();
}
Aukščiau esančiame kodo bloke pikis metodas pakeičia būseną iš dabartinės būsenos į aukščio būseną.
Panašiai visi kiti metodai pakeis būseną iš dabartinės programos būsenos į atitinkamas būsenas.
Atnaujinkite taikymo metodus į toliau nurodytus kodo blokus:
The juodraštis metodas:
viešasjuodraštis(): tuštuma{
tai.state = tai.state.draft();
tai.showCurrentState();
}
The Redaguoti metodas:
viešasRedaguoti(): tuštuma{
tai.state = tai.state.edit();
tai.showCurrentState();
}
Ir paskelbti metodas:
viešaspaskelbti(): tuštuma{
tai.state = tai.state.publish();
tai.showCurrentState();
}
Baigtos programos naudojimas
Jūsų baigta programos klasė turėtų būti panaši į toliau pateiktą kodo bloką:
// Taikymas
klasėStraipsnispadargaiStraipsnio sąsaja{
privatus būsena: straipsnisBūsena = naujas LaukiamaDraftState();konstruktorius() {
tai.showCurrentState();
}privatusparodytiCurrentState(): tuštuma{
konsolė.log(tai.state);
}viešaspikis(): tuštuma{
tai.state = tai.state.pitch();
tai.showCurrentState();
}viešasjuodraštis(): tuštuma{
tai.state = tai.state.draft();
tai.showCurrentState();
}viešasRedaguoti(): tuštuma{
tai.state = tai.state.edit();
tai.showCurrentState();
}
viešaspaskelbti(): tuštuma{
tai.state = tai.state.publish();
tai.showCurrentState();
}
}
Būsenos perėjimus galite išbandyti iškvietę metodus teisinga seka. Pavyzdžiui:
konst dokumentai = naujas Straipsnis(); // Laukiama juodraščio būsena: {}
docs.pitch(); // Juodraščio būsena: {}
docs.draft(); // Redagavimo būsena: {}
docs.edit(); // Paskelbta būsena: {}
docs.publish(); // Laukiama juodraščio būsena: {}
Aukščiau pateiktas kodo blokas veikia, nes programos būsenos buvo tinkamai perkeltos.
Jei bandysite pakeisti būseną neleistinu būdu, pavyzdžiui, iš tono būsenos į redagavimo būseną, programa parodys klaidą:
konst dokumentai = naujas Straipsnis(); // Laukiama juodraščio būsena: {}
docs.pitch() // Juodraščio būsena: {}
docs.edit() // Netinkama operacija: negalima atlikti užduoties dabartinėje būsenoje
Šį modelį turėtumėte naudoti tik tada, kai:
- Kuriate objektą, kuris elgiasi skirtingai, priklausomai nuo dabartinės būsenos.
- Objektas turi daug būsenų.
- Būsenai būdingas elgesys dažnai keičiasi.
Valstybinio modelio pranašumai ir kompromisai
Šis modelis pašalina sudėtingus sąlyginius teiginius ir išlaiko vienintelę atsakomybę bei atviro / uždaro principus. Tačiau tai gali būti perdėta, jei programa turi keletą būsenų arba jos būsenos nėra ypač dinamiškos.