Vzorci oblikovanja so preizkušene rešitve, ki se uporabljajo za reševanje pogostih problemov oblikovanja in zmanjšanje zapletenosti kode. Gang of Four oblikovalski vzorci spadajo v tri kategorije:
- Ustvarjalni - vzorci, povezani z ustvarjanjem predmetov
- Strukturni - vzorci, povezani s sestavljanjem predmetov
- Vedenje - vzorci, povezani s predmetnim sodelovanjem in ločitvijo odgovornosti
Vzorec načrtovanja ukazov spada v kategorijo vedenjskih vzorcev. Ta članek raziskuje, kako lahko delamo z vzorcem načrtovanja ukazov v jeziku C #.
Kakšen je vzorec načrtovanja ukazov?
Namen vzorca načrtovanja ukazov je ločiti zahtevnika dejanja od predmeta, ki izvede dejanje. V vzorcu načrtovanja ukazov je zahteva vključena v objekt, ki vsebuje vse informacije o zahtevi. Ta predmet se nato posreduje klicatelju. Objekt, ki pokliče, nato poišče ustrezen objekt, ki bo obdeloval ukaz, in ukaz preda predmetu.
Vzorec načrtovanja ukazov je dobra izbira, če želite v svojo aplikacijo implementirati povratne klice, opravila v čakalni vrsti, zgodovino sledenja in funkcijo razveljavitve / ponovitve. Ukazni vzorec je dobra izbira za izvajanje mehanizmov ponovnega poskusa - kadar bi se vaša aplikacija želela znova poskusiti povezati s storitvijo pozneje, ki v tem trenutku ne deluje. Vzorec ukaza se uporablja tudi v aplikacijah za čakanje na sporočila, torej v aplikacijah, ki jih je treba obnoviti zaradi izgube podatkov.
Udeleženci vzorca oblikovanja ukazov
V klasični izvedbi vzorca Command imate štiri komponente: ukaz, klicatelj, sprejemnik in odjemalec. Udeleženci v vzorcu načrtovanja ukazov vključujejo naslednje:
- Ukaz - ponuja vmesnik za izvajanje operacije
- ConcreteCommand - razširja vmesnik Command in izvaja metodo Execute
- Naročnik - ustvari razred ConcreteCommand
- Invoker - obvesti ukaz za izvedbo zahteve
- Sprejemnik - vsebuje logiko za izvajanje operacij, povezanih z zahtevo
Primer vzorca oblikovanja ukazov v jeziku C #
V naslednjem poglavju bomo raziskali, kako lahko uporabimo vzorec načrtovanja ukazov. V našem primeru bomo izvedli preprost kalkulator z uporabo naslednjih razredov:
- Ukaz (osnovni razred abstraktnega ukaza)
- SimpleCalculator (razred sprejemnika)
- AddCommand (konkretni ukazni razred)
- SubstrateCommand (konkreten ukazni razred)
- Multiply Command (konkretni ukazni razred)
- DivideCommand (konkreten ukazni razred)
- Invoker (razred Invoker)
Ustvari osnovni razred Command abstract v jeziku C #
Razmislite o naslednjem abstraktnem osnovnem razredu z imenom Command, ki vsebuje izjavo metode Execute.
javni abstraktni razred Command{
zaščiten sprejemnik SimpleCalculator;
javni ukaz (sprejemnik SimpleCalculator)
{
this.receiver = sprejemnik;
}
javni povzetek int Execute ();
}
Naslednji enum prikazuje operacije, ki jih bo podpiral naš preprost kalkulator.
javni enum CommandOption{
Dodaj, odstrani, pomnoži, deli
}
Ustvarite razred sprejemnika v jeziku C #
Sledi razred z imenom SimpleCalculator. Ta razred deluje kot sprejemnik in vsebuje definicijo metod seštevanja, odštevanja, množenja in deljenja.
javni razred SimpleCalculator{
zasebno int _x, _y;
javni SimpleCalculator (int a, int b)
{
_x = a;
_y = b;
}
javni int Dodaj ()
{
vrnitev _x + _y;
}
public int Odštej ()
{
vrnitev _x - _y;
}
javni int Multiply ()
{
vrnitev _x * _y;
}
javni int Divide ()
{
vrnitev _x / _y;
}
}
Ustvarite konkretne ukazne razrede v jeziku C #
Konkretni ukazni razredi razširjajo osnovni razred abstraktnega ukaza in izvajajo metodo Execute, kot je prikazano spodaj.
javni razred AddCommand: Ukaz{
zasebni SimpleCalculator _calculator;
javni AddCommand (kalkulator SimpleCalculator): osnova (kalkulator)
{
_kalkulator = kalkulator;
}
public override int Execute ()
{
return _calculator.Add ();
}
}
javni razred SubtractCommand: Command
{
zasebni SimpleCalculator _calculator;
javni SubtractCommand (kalkulator SimpleCalculator):
osnova (kalkulator)
{
_kalkulator = kalkulator;
}
public override int Execute ()
{
return _calculator.Subtract ();
}
}
javni razred MultiplyCommand: Ukaz
{
zasebni SimpleCalculator _calculator;
javni MultiplyCommand (kalkulator SimpleCalculator):
osnova (kalkulator)
{
_kalkulator = kalkulator;
}
public override int Execute ()
{
return _calculator.Multiply ();
}
}
javni razred DivideCommand: Command
{
zasebni SimpleCalculator _calculator;
javni DivideCommand (kalkulator SimpleCalculator):
osnova (kalkulator)
{
_kalkulator = kalkulator;
}
public override int Execute ()
{
return _calculator.Divide ();
}
}
Ustvarite razred Invoker v jeziku C #
Naslednji delček kode ponazarja razred Invoker. Vsebuje dve metodi, SetCommand in Execute. Medtem ko se SetCommand uporablja za dodelitev ukaznega predmeta zasebnemu sklicu ukaza v razredu Invoker, se Execute uporablja za izvajanje ukaza.
javni razred Invoker{
private Command _command;
javna void SetCommand (ukaz ukaza)
{
_command = ukaz;
}
javni int Izvedi ()
{
return _command.Execute ();
}
}
Vzorec načrtovanja ukazov v akciji v C #
Naslednji delček kode ponazarja, kako lahko izvedete preprost izračun z uporabo razreda SimpleCalculator.
statična praznina Main (string [] args){
Kalkulator SimpleCalculator = nov SimpleCalculator (15, 3);
var addCommand = nov AddCommand (kalkulator);
var substrateCommand = novo SubtractCommand (kalkulator);
var multiplyCommand = nov MultiplyCommand (kalkulator);
var divideCommand = nov DivideCommand (kalkulator);
Invoker invoker = new Invoker ();
invoker.SetCommand (addCommand);
Console.WriteLine ("Rezultat je {0}", invoker.Execute ());
invoker.SetCommand (substrateCommand);
Console.WriteLine ("Rezultat je {0}", invoker.Execute ());
invoker.SetCommand (multiplyCommand);
Console.WriteLine ("Rezultat je {0}", invoker.Execute ());
invoker.SetCommand (divideCommand);
Console.WriteLine ("Rezultat je {0}", invoker.Execute ());
Console.ReadLine ();
}
Vzorec načrtovanja ukazov zagotavlja podporo za razširljivost in zmanjšuje povezavo, ki obstaja med priklicateljem in prejemnikom ukaza. Ker je zahteva vdelana v samostojni objekt, lahko metode parametrirate z različnimi zahtevami, shranite zahteve v čakalno vrsto in celo zagotovite podporo za ponovljive ali onemogočene operacije.
—
Naredite več s C #:
- Kako delati z AutoMapper v C #
- Kdaj uporabiti abstraktni razred v primerjavi z vmesnikom v jeziku C #
- Kako delati z nitmi v jeziku C #
- Kako uporabljati Dapper ORM v C #
- Kako implementirati vzorec oblikovanja repozitorija v C #
- Kako implementirati preprost zapisovalnik v jeziku C #
- Kako delati z delegati v C #
- Kako delati z delegati Action, Func in Predicate v C #
- Kako delati z log4net v C #
- Kako delati z refleksijo v jeziku C #