Programiranje

Kako uporabiti vzorec načrtovanja ukazov v C #

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 #