Created
May 27, 2024 09:21
-
-
Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.
strategy pattern 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 FlyBehavior | |
{ | |
void Fly(); | |
} | |
interface QuackBehavior | |
{ | |
void Quack(); | |
} | |
// классы, реализующие типы полёта | |
class FlyWithWings : FlyBehavior | |
{ | |
public void Fly() | |
{ | |
Console.WriteLine("машет крыльями!"); | |
} | |
} | |
class Flightless : FlyBehavior | |
{ | |
public void Fly() | |
{ | |
Console.WriteLine("я не умею летать :("); | |
} | |
} | |
class JetPack : FlyBehavior | |
{ | |
public void Fly() | |
{ | |
Console.WriteLine("использует реактивный ранец"); | |
} | |
} | |
// классы, реализующие типы кряканья | |
class UsualQuack : QuackBehavior | |
{ | |
public void Quack() | |
{ | |
Console.WriteLine("кря-кря!"); | |
} | |
} | |
class Squeak : QuackBehavior | |
{ | |
public void Quack() | |
{ | |
Console.WriteLine("пиип-пиип!"); | |
} | |
} | |
class SilentSqueak : QuackBehavior | |
{ | |
public void Quack() | |
{ | |
Console.WriteLine("* звук сверчка *"); | |
} | |
} | |
// базовый абстрактный класс уток | |
abstract class Duck | |
{ | |
protected FlyBehavior? flyBehavior; | |
protected QuackBehavior? quackBehavior; | |
public virtual void Swim() | |
{ | |
Console.WriteLine("все утки плавают!"); | |
} | |
public abstract void Display(); | |
public void PerformFly() | |
{ | |
flyBehavior?.Fly(); | |
} | |
public void PerformQuack() | |
{ | |
quackBehavior?.Quack(); | |
} | |
public void SetFlyBehavior(FlyBehavior newFlyBehavior) | |
{ | |
flyBehavior = newFlyBehavior; | |
} | |
public void SetQuackBehavior(QuackBehavior newQuackBehavior) | |
{ | |
quackBehavior = newQuackBehavior; | |
} | |
} | |
// конкретные утки | |
class MallardDuck : Duck | |
{ | |
public MallardDuck() | |
{ | |
flyBehavior = new FlyWithWings(); | |
quackBehavior = new UsualQuack(); | |
} | |
public override void Display() | |
{ | |
Console.WriteLine("mallard.jpg"); | |
} | |
} | |
class RubberDuck : Duck | |
{ | |
public RubberDuck() | |
{ | |
flyBehavior = new Flightless(); | |
quackBehavior = new Squeak(); | |
} | |
public override void Display() | |
{ | |
Console.WriteLine("rubber.jpg"); | |
} | |
} | |
class DecoyDuck : Duck // деревянная утка-манок | |
{ | |
public DecoyDuck() | |
{ | |
flyBehavior = new Flightless(); | |
quackBehavior = new SilentSqueak(); | |
} | |
public override void Display() | |
{ | |
Console.WriteLine("decoy.jpg"); | |
} | |
} | |
class Program | |
{ | |
static void Main() | |
{ | |
Console.WriteLine("Решение # 2"); | |
Duck duck = new MallardDuck(); | |
duck.PerformFly(); | |
duck.PerformQuack(); | |
duck.Swim(); | |
// duck.Display(); | |
Console.WriteLine(); | |
duck = new RubberDuck(); | |
duck.PerformFly(); | |
duck.PerformQuack(); | |
// duck.Swim(); | |
Console.WriteLine(); | |
duck = new DecoyDuck(); | |
duck.PerformFly(); | |
duck.PerformQuack(); | |
// duck.Swim(); | |
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