Паттерн Стратегия определяет семейство схожих алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. Он позволяет модифицировать алгоритмы независимо от их использования на стороне клиента.
Если простыми словами, то определяются схожие функции помещая их в собственные классы и позволяет их изменять во время работы программы. Из представленного примера ниже, мы видим схожий функционал всех уток, какие-то летают, какие-то плавают, какие-то молчат, каждый из них мы поместили в свои классы, реализуемыми своим объединённым интерфейсом, а дальше в общем абстрактном классе создали свойства ссылающихся на эти интерфейсы, которые будем инициализировать исходя из надобностей объекта. Резиновая утка к примеру может плавать и издавать звуки, но не умеет летать итд.
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(); } } }
