Паттерн стратегия в примерах на C#

Паттерн Стратегия определяет семейство схожих алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. Он позволяет модифицировать алгоритмы независимо от их использования на стороне клиента.

Если простыми словами, то определяются схожие функции помещая их в собственные классы и позволяет их изменять во время работы программы. Из представленного примера ниже, мы видим схожий функционал всех уток, какие-то летают, какие-то плавают, какие-то молчат, каждый из них мы поместили в свои классы, реализуемыми своим объединённым интерфейсом, а дальше в общем абстрактном классе создали свойства ссылающихся на эти интерфейсы, которые будем инициализировать исходя из надобностей объекта. Резиновая утка к примеру может плавать и издавать звуки, но не умеет летать итд.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Паттерн_Стратегия
{
    class Program
    {
        public interface IFlyBehavior
        {
           void Fly();
        }

        public class FlyWithWings : IFlyBehavior //летает с крыльями
        {
            public void Fly() //утки которые умеют летать
            {
                Console.WriteLine("Я лечу"); ;
            }
        }

        public class FlyNowWay : IFlyBehavior 
        {
            public void Fly()//утки которые не умеют летать
            {
                Console.WriteLine("Я не умею летать");
            }
        }


        public interface IQuackBehavior
        {
            void Quack();
        }

        public class Quacks: IQuackBehavior
        {
           public void Quack()
            {
                Console.WriteLine("Кря кря.."); //утки которые крякают
            }
        }
        public class Squeak : IQuackBehavior
        {
            public void Quack()
            {
                Console.WriteLine("Пи - Пи");//утки которые пищат

                
            }
        }

        public class MuteQuack : IQuackBehavior 
        {
            public void Quack() //утки которые не издают звуков
            {
                Console.WriteLine("Ммм... Ммм...");
            }
        }

        public interface ISwimBehavior
        {
            void Swim();
        }

        public class IamSwims : ISwimBehavior
        {
            public void Swim()
            {
                Console.WriteLine("Я плыву!!");
            }
        }
        public class IamNotSwims : ISwimBehavior
        {
            public void Swim()
            {
                Console.WriteLine("Я не умею плавать");
            }
        }
        public abstract class Duck
        {

            protected IFlyBehavior flyBehavior;

            protected IQuackBehavior quackBehavior;

            protected ISwimBehavior swimBehavior;


            public abstract void Display();//Дисплей


            public void PerformSwim()
            {
                swimBehavior.Swim();
            }


            public void PerformFly()
            {
                flyBehavior.Fly();
            }

            public void PerformQuack()
            {
                quackBehavior.Quack();
            }

            public void SetFlyBehavior(IFlyBehavior f)
            {
                flyBehavior = f;
            }
            public void SetQuackBehavior(IQuackBehavior q)
            {
                quackBehavior = q;
            }
        }

        public class ModelDuck : Duck
        {
            public ModelDuck()
            {
                 flyBehavior = new FlyNowWay();
                 quackBehavior= new Quacks();
                 swimBehavior = new IamSwims();
        }

            public override void Display()
            {
                Console.WriteLine("Я модель утки");
            }
        }

        public class FlyRocketPowered : IFlyBehavior
        {
            public void Fly()
            {
                Console.WriteLine("Я лечу потому что я ракета!");
            }
        }

        public class MallardDuck : Duck//утка игрушка
        {
            public MallardDuck()
            {
                flyBehavior = new FlyWithWings();
                quackBehavior = new Quacks();
                swimBehavior = new IamSwims();
            }

            public override void Display()
            {
                Console.WriteLine("Я утка MallarDuck");
            }
        }



        public class RedHeadDuck : Duck//, IFlyBehavior // утка с красной головой
        {
            public RedHeadDuck()
            {
                flyBehavior = new FlyWithWings();
                quackBehavior = new Quacks();
                swimBehavior = new IamSwims();
            }


            public override void Display()
            {
                Console.WriteLine("Я утка RedHeadDuck");
            }

        }
        public class RubberDuck : Duck
        {
            public RubberDuck()
            {
                flyBehavior = new FlyWithWings();
                quackBehavior = new MuteQuack();
                swimBehavior = new IamSwims();
            }

            public override void Display()
            {
                Console.WriteLine("Я утка RubberDuck");
            }
        }

        public class DecoyDuck : Duck
        {
            public DecoyDuck()
            {
                flyBehavior = new FlyNowWay();
                quackBehavior = new MuteQuack();
                swimBehavior = new IamSwims();
            }
            public override void Display()
            {
                Console.WriteLine("Я утка DecoyDuck");
            }
        }

        public class ManokQuack : IQuackBehavior
        {
            public void Quack()
            {
                Console.WriteLine("Я издаю утиный звуки"); ;
            }
        }
        public class Manok : Duck
        {
            public Manok()
            {
                flyBehavior = new FlyNowWay();
                quackBehavior = new Quacks();
                swimBehavior = new IamNotSwims();
            }
            public override void Display()
            {
                Console.WriteLine("Я манок");
            }
        }

        static void Main()
        {
            Duck mallarDuck = new MallardDuck();
            mallarDuck.Display();
            mallarDuck.PerformSwim();
            mallarDuck.PerformFly();
            mallarDuck.PerformQuack();

            Console.WriteLine(new string('-', 50));

            Duck redHead = new RedHeadDuck();
            redHead.Display();
            redHead.PerformSwim();
            redHead.PerformFly();
            redHead.PerformQuack();

            Console.WriteLine(new string('-', 50));

            Duck rubberDuck = new RubberDuck();
            rubberDuck.Display();
            rubberDuck.PerformSwim();
            rubberDuck.PerformFly();
            rubberDuck.PerformQuack();

            Console.WriteLine(new string('-', 50));

            Duck decoyDuck = new DecoyDuck();
            decoyDuck.Display();
            decoyDuck.PerformSwim();
            decoyDuck.PerformFly();
            decoyDuck.PerformQuack(); 

            Console.WriteLine(new string('-', 50));

            Duck duck = new ModelDuck();
            duck.Display();
            duck.PerformSwim();
            duck.PerformFly();
            duck.SetFlyBehavior(new FlyRocketPowered());
            duck.PerformFly();


            Console.WriteLine(new string('-', 50));

            Duck manok = new Manok();
            manok.Display();
            manok.SetQuackBehavior(new ManokQuack());
            manok.PerformSwim();
            manok.PerformFly();
            manok.PerformQuack();
            Console.ReadLine();
        }
    }
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.