Kako koristiti obrazac dizajna naredbi u C #

Uzorci dizajna su provjerena rješenja koja se koriste za rješavanje uobičajenih problema s dizajnom i smanjenje složenosti koda. Gang of Four dizajnerski uzorci mogu se podijeliti u tri kategorije:

  • Kreativni - obrasci povezani s stvaranjem predmeta
  • Strukturni - obrasci povezani sa sastavljanjem predmeta
  • Ponašanje - obrasci povezani s objektnom suradnjom i podjelom odgovornosti

Uzorak dizajna naredbi spada u kategoriju uzorka ponašanja. Ovaj članak istražuje kako možemo raditi s uzorkom dizajna naredbi u C #.

Koji je obrazac dizajna naredbi?

Namjera uzorka dizajna naredbe je razdvojiti zahtjevnik radnje od objekta koji izvršava radnju. U obrascu dizajna naredbe, zahtjev je enkapsuliran kao objekt koji sadrži sve informacije o zahtjevu. Ovaj se objekt zatim prosljeđuje objektu koji poziva. Pokretač objekta zatim traži odgovarajući objekt za rukovanje naredbom i predaje naredbu objektu.

Uzorak dizajna naredbi dobar je izbor kada u svoju aplikaciju želite implementirati povratne pozive, zadatke u redovima čekanja, povijest praćenja i poništavanje / ponavljanje funkcionalnosti. Uzorak naredbi dobar je izbor za implementaciju mehanizama ponovnog pokušaja - kada vaša aplikacija želi pokušati ponovno uspostaviti vezu sa uslugom u kasnijem trenutku koji u ovom trenutku nije pokrenut i pokrenut. Uzorak naredbe također se koristi u aplikacijama za čekanje poruka, tj. U aplikacijama koje se trebaju oporaviti od gubitka podataka.

Sudionici uzoraka dizajna naredbi

U klasičnoj provedbi obrasca naredbe imate četiri komponente: naredbu, pozivatelja, prijamnika i klijenta. Sudionici u obrascu dizajna naredbi uključuju sljedeće:

  • Naredba - pruža sučelje za izvršavanje radnje
  • ConcreteCommand - proširuje naredbeno sučelje i implementira metodu Execute
  • Klijent - instancira klasu ConcreteCommand
  • Pozivač - obavještava naredbu da izvrši zahtjev
  • Prijemnik - sadrži logiku za izvršavanje operacija povezanih sa zahtjevom

Primjer uzorka dizajna naredbe u C #

U sljedećem odjeljku istražit ćemo kako možemo implementirati obrazac dizajna naredbi. U našem primjeru implementirat ćemo jednostavan kalkulator koristeći sljedeće klase:

  • Naredba (osnovna klasa naredbe sažetak)
  • SimpleCalculator (klasa prijemnika)
  • AddCommand (konkretna klasa naredbi)
  • SubstractCommand (konkretna naredbena klasa)
  • Multiply Command (konkretna klasa naredbi)
  • DivideCommand (konkretna naredbena klasa)
  • Invoker (klasa Invoker)

Stvorite naredbenu apstraktnu osnovnu klasu u C #

Razmotrite sljedeću apstraktnu osnovnu klasu pod nazivom Command koja sadrži deklaraciju metode Execute.

javni sažetak klase Naredba

    {

        zaštićeni prijamnik SimpleCalculator;

        javna naredba (prijamnik SimpleCalculator)

        {

            this.receiver = prijemnik;

        }

        sažetak javnosti int Execute ();

    }

Sljedeći nabrajanje prikazuje operacije koje će biti podržane u našem jednostavnom kalkulatoru.

javni popis CommandOption

    {

        Zbrajanje, sažimanje, množenje, dijeljenje

    }

Stvorite klasu Receiver u C #

Slijedi klasa pod nazivom SimpleCalculator. Ova klasa djeluje kao prijemnik i sadrži definiciju metoda zbrajanja, oduzimanja, množenja i dijeljenja.

javna klasa SimpleCalculator

    {

        privatni int _x, _y;

        javni SimpleCalculator (int a, int b)

        {

            _x = a;

            _y = b;

        }

        javni int Dodaj ()

        {

            povratak _x + _y;

        }

        javni int Oduzmi ()

        {

            povratak _x - _y;

        }

        javni int Množi ()

        {

            povratak _x * _y;

        }

        javni int Divide ()

        {

            povratak _x / _y;

        }

    }

Stvorite konkretne klase naredbi u C #

Konkretne klase naredbi proširuju osnovnu klasu Apstraktna naredba i implementiraju metodu Execute kako je prikazano u nastavku.

 javna klasa AddCommand: Command

    {

        privatni SimpleCalculator _calculator;

        javni AddCommand (kalkulator SimpleCalculator): baza (kalkulator)

        {

            _kalkulator = kalkulator;

        }

        javno nadjačavanje int Execute ()

        {

            return _calculator.Add ();

        }

    }

    javna klasa SubtractCommand: Command

    {

        privatni SimpleCalculator _calculator;

        javni SubtractCommand (kalkulator SimpleCalculator):

        baza (kalkulator)

        {

            _kalkulator = kalkulator;

        }

        javno nadjačavanje int Execute ()

        {

            return _calculator.Subtract ();

        }

    }

    javna klasa MultiplyCommand: Command

    {

        privatni SimpleCalculator _calculator;

        javni MultiplyCommand (kalkulator SimpleCalculator):

        baza (kalkulator)

        {

            _kalkulator = kalkulator;

        }

        javno nadjačavanje int Execute ()

        {

            return _calculator.Multiply ();

        }

    }

    javna klasa DivideCommand: Command

    {

        privatni SimpleCalculator _calculator;

        javni DivideCommand (kalkulator SimpleCalculator):

        baza (kalkulator)

        {

            _kalkulator = kalkulator;

        }

        javno nadjačavanje int Execute ()

        {

            return _calculator.Divide ();

        }

    }

Stvorite klasu Invoker u C #

Sljedeći isječak koda ilustrira klasu Invoker. Sadrži dvije metode, SetCommand i Execute. Dok se SetCommand koristi za dodjeljivanje naredbenog objekta privatnoj referenci naredbe u klasi Invoker, Execute se koristi za izvršavanje naredbe.

    javna klasa Invoker

    {

        private Command _command;

        javna praznina SetCommand (naredba naredbe)

        {

            _komanda = naredba;

        }

        javni int Izvrši ()

        {

            return _command.Execute ();

        }

    }

Uzorak dizajna naredbi na djelu u C #

Konačno, sljedeći isječak koda ilustrira kako možete izvršiti jednostavan izračun pomoću klase SimpleCalculator.

statička praznina Main (string [] args)

        {

            SimpleCalculator kalkulator = novi SimpleCalculator (15, 3);

            var addCommand = novi AddCommand (kalkulator);

            var substractCommand = novi SubtractCommand (kalkulator);

            var multiplyCommand = novi MultiplyCommand (kalkulator);

            var divideCommand = novi DivideCommand (kalkulator);

            Invoker invoker = novi 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 ();

        }

Uzorak dizajna naredbe pruža podršku za proširivost i smanjuje spregu koja postoji između pozivatelja i primatelja naredbe. Budući da je zahtjev enkapsuliran u samostalni objekt, možete parameterizirati metode s različitim zahtjevima, spremati zahtjeve u red čekanja, pa čak i pružiti podršku za ponovljive ili poništene operacije.

-

Učinite više sa C #:

  • Kako raditi s AutoMapperom u C #
  • Kada koristiti apstraktnu klasu naspram sučelja u C #
  • Kako raditi s nitima u C #
  • Kako koristiti Dapper ORM u C #
  • Kako implementirati obrazac dizajna spremišta u C #
  • Kako implementirati jednostavni zapisnik u C #
  • Kako raditi s delegatima u C #
  • Kako raditi s delegatima Action, Func i Predicate u C #
  • Kako raditi s log4netom na C #
  • Kako raditi s refleksijom u C #