Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created November 24, 2023 14:15
Show Gist options
  • Save sunmeat/4299c11f5f315d7079058d06551d7e4d to your computer and use it in GitHub Desktop.
Save sunmeat/4299c11f5f315d7079058d06551d7e4d to your computer and use it in GitHub Desktop.
strategy C# example
// Интерфейсы, описывающие абстрактное поведение
interface IFlyBehavior
{
void Fly();
}
interface IQuackBehavior
{
void Quack();
}
// Классы, реализующие типы полета
class FlyWithWings : IFlyBehavior
{
public void Fly()
{
Console.WriteLine("машет крыльями!");
}
}
class Flightless : IFlyBehavior
{
public void Fly()
{
Console.WriteLine("я не умею летать :(");
}
}
class JetPack : IFlyBehavior
{
public void Fly()
{
Console.WriteLine("использует реактивный ранец");
}
}
// Классы, реализующие типы кряканья
class UsualQuack : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("кря-кря!");
}
}
class Squeak : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("пиип-пиип!");
}
}
class SilentSqueak : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("* тишина *");
}
}
// Базовый абстрактный класс для уток
abstract class Duck
{
protected IFlyBehavior flyBehavior;
protected IQuackBehavior quackBehavior;
public virtual void Swim()
{
Console.WriteLine("все утки плавают!");
}
public abstract void Display();
public void PerformFly()
{
flyBehavior.Fly();
}
public void PerformQuack()
{
quackBehavior.Quack();
}
public void SetFlyBehavior(IFlyBehavior newFlyBehavior)
{
flyBehavior = newFlyBehavior;
}
public void SetQuackBehavior(IQuackBehavior newQuackBehavior)
{
quackBehavior = newQuackBehavior;
}
}
// Конкретные утки
class MallardDuck : Duck
{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new UsualQuack();
}
public override void Display()
{
Console.WriteLine("Displaying Mallard Duck");
}
}
class RubberDuck : Duck
{
public RubberDuck()
{
flyBehavior = new Flightless();
quackBehavior = new Squeak();
}
public override void Display()
{
Console.WriteLine("Displaying Rubber Duck");
}
}
class DecoyDuck : Duck
{
public DecoyDuck()
{
flyBehavior = new Flightless();
quackBehavior = new SilentSqueak();
}
public override void Display()
{
Console.WriteLine("Displaying Decoy Duck");
}
}
class Program
{
static void Main()
{
Console.Title = "Решение #2";
Duck duck = new MallardDuck();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
duck.Display();
Console.WriteLine();
duck = new RubberDuck();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
duck.Display();
Console.WriteLine();
duck = new DecoyDuck();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
duck.Display();
Console.WriteLine();
duck.SetFlyBehavior(new JetPack());
duck.SetQuackBehavior(new Squeak());
duck.PerformFly();
duck.PerformQuack();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment