Created
November 24, 2023 14:15
-
-
Save sunmeat/4299c11f5f315d7079058d06551d7e4d to your computer and use it in GitHub Desktop.
strategy C# example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Интерфейсы, описывающие абстрактное поведение | |
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