Strategy pattern

Rende intercambiabili un gruppo di algoritmi incapsulandoli per famiglie (Interfacce); questo fa in modo che all’interno della stessa famiglia (Interfaccia) gli algoritmi siano interscambiabili

Essendo un pattern abbastanza semplice da capire pubblico il codice della sua implementazione e lo spiego passo passo
public abstract  class Character
        {
            public IWeaponBehavior Weapon;
            public void ChangeWeapon (IWeaponBehavior newWeapon)
            {
                this.Weapon = newWeapon;
            }

              public abstract void Fight();
        }
        public interface IWeaponBehavior
        {
            void UseWeapon();
        }

Innanzitutto abbiamo una classe Character di tipo astratto che rappresenta i personaggi di un ipotetico videogame fantasy come potete vedere questa classe ha un metodo ChangeWeapon che si occupa di “Cambiare arma” ed un metodo astratto fight che, vedremo in seguito, si occuperà di usare l’arma.
Weapon è di tipo IWeaponBehavior proprio per implementare lo strategy pattern in modo che le proprietà di combattimento siano legate all’arma e non al personaggio che si dovrà occupare solo di usarla. Continuiamo introducendo un personaggio reale e le sue armi.

public class ArmaSpada: IWeaponBehavior
        {
            public void UseWeapon()
            {
                Console.WriteLine("ti spacco con la spada!!!");
            }
        }
        public class ArmaArco : IWeaponBehavior
        {
            public void UseWeapon()
            {
                Console.WriteLine("ti spacco con l'arco!!!");
            }
        }
        public class Guerriero : Character
        {
           public override void Fight()
            {
               if (Weapon == null)
               {
                 Console.WriteLine("Minchia sono senza armi! ");
               }
               else
               {
                     Weapon.UseWeapon();
                }

            }
        }

Ogni arma come vedete implementa il metodo UseWeapon nel modo che più la rappresenta, così facendo il guerriero si dovrà occupare di utilizzarla e basta , relegando un eventuale conteggio dei danni all’arma stessa! Se ora guardiamo la classe Guerriero vediamo come questa sia un’implementazione della classe Character e tramite il metodo Fight possa combattere usando le armi senza sapere di che arma si tratta ma semplicemente utilizzandola!
Riflessioni:
Provate ad immaginare come sarebbe stato complicato aggiungere delle armi in seguito se avessimo implementato l’uso di queste direttamente all’interno della classe guerriero e quanto codice avremmo dovuto ripetere per riusare la stessa arma con altri personaggi! Giusto per fare un idea posto del codice SBAGLIATO

public class Elfo : Character
        {
            public string arma;
            public void CombattiConSpada()
            {
                Console.WriteLine("ti spacco con la spada!!!");
            }
            public void CombattiConArco()
            {
                Console.WriteLine("ti spacco con l'arco!!!");
            }

            public override void Fight()
            {
                if (arma == "Spada") CombattiConSpada();
                if (arma == "Arco") CombattiConArco();
            }
        }
        public class Mago : Character
        {
            public string arma;
            public void CombattiConArco()
            {
                Console.WriteLine("ti spacco con l'arco!!!");
            }

            public override void Fight()
            {
                if (arma == "Arco") CombattiConArco();
            }
        }

è abbastanza facile capire come lo strategy pattern mi sta semplificando la vita! provate ad immaginare quante modifiche devo fare per fare si che il mago possa usare una spada!!
Ricordate che generalmente quando in un codice ci sono dei SELECT CASE oppure tanti IF c’è qualcosa che puzza!!!

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...