using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPattern._1.StrategyPattern
{
public abstract class Duck
{
public IFlyBehavior flyBehavior = null;
public IQuackBehavior quackBehavior = null;
public Duck(){}
public abstract void display();
public void performFly()
{
flyBehavior.fly();
}
public void performQuack()
{
quackBehavior.quack();
}
public void swim()
{
Console.WriteLine("All ducks float, even decoys");
}
public void setFlyBehavior(IFlyBehavior fb)
{
flyBehavior = fb;
}
public void SetQuackBehavior(IQuackBehavior qb)
{
quackBehavior = qb;
}
}
public class MallardDuck : Duck
{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
public override void display()
{
Console.WriteLine("I'm a real Mallard Duck");
}
}
public interface IFlyBehavior
{
void fly();
}
public class FlyWithWings : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying");
}
}
public class FlyNoWay : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I can't fly");
}
}
public interface IQuackBehavior
{
void quack();
}
public class Quack: IQuackBehavior
{
public void quack()
{
Console.WriteLine("Quack");
}
}
public class MuteQuack:IQuackBehavior
{
public void quack()
{
Console.WriteLine("<<Silence>>");
}
}
public class Sqleak:IQuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak");
}
}
public class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public override void display()
{
Console.WriteLine("I'm a model duck");
}
}
public class FlyRockekPowered:IFlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying with a rocket!");
}
}
public class StragegyPatternTestClass
{
public StragegyPatternTestClass()
{
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRockekPowered());
model.performFly();
}
}
}
namespace DesignPattern
{
class Program
{
static void Main(string[] args)
{
//1. Stragegy Pattern
new StragegyPatternTestClass();//StragegyPattern
System.Console.Read();
}
}
}