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

