C# 这是正确的战略实施吗

C# 这是正确的战略实施吗,c#,strategy-pattern,C#,Strategy Pattern,我已经尝试用Startegy实现头先鸭问题。我正在尝试实现诱饵鸭,它最初没有嘎嘎或飞行的功能,是通过调用默认构造函数实现的(我知道这只鸭子没有飞行或嘎嘎的能力)。通过调用重写的constructor初始化所有其他鸭子。在这本书中,一只没有苍蝇的鸭子是用一个实现IFly接口的类FlyNoFly实现的 对于我的解决方案,我不使用这个类。相反,我在基duck类中检查Fly属性是否为其传递了有效实例(通过if(Fly!=null)。如果Fly具有有效引用,则只有我在该类上Invlock Fly方法。否则

我已经尝试用Startegy实现头先鸭问题。我正在尝试实现诱饵鸭,它最初没有嘎嘎或飞行的功能,是通过调用默认构造函数实现的(我知道这只鸭子没有飞行或嘎嘎的能力)。通过调用重写的constructor初始化所有其他鸭子。在这本书中,一只没有苍蝇的鸭子是用一个实现IFly接口的类FlyNoFly实现的

对于我的解决方案,我不使用这个类。相反,我在基duck类中检查Fly属性是否为其传递了有效实例(通过if(Fly!=null)。如果Fly具有有效引用,则只有我在该类上Invlock Fly方法。否则,我将抛出一条默认消息

我想知道我的实现是否违反了任何设计原则/这是否是一个有效的实现

谢谢 图图蒙


不,这不是正确的实现


策略模式用于避免在面向对象代码中使用
if(..)
。如果要使用FlyNoFly类,则应避免使用
if(null)
检查,您可以对所有Duck对象使用相同的构造函数。

感谢您的回复。我不担心这里的构造函数,我们也可以从代码中删除所有构造函数。我认为StackExchange站点更适合此类问题。
public abstract class Duck
{
    public IFlyable Fly { get; set; }
    public IQuackable Quack { get; set; }
    public void PerformQuack()
    {
        //Is this checking valid as per OO?
        if (Quack != null)
            Quack.Quack();
        else
            Console.WriteLine("Quack Operation Not supported");
    }

    public void PerformFly()
    {
         //Is this checking valid as per OO?
         if (Fly != null)
             Fly.Fly();
         else
             Console.WriteLine("Fly Operation not supported");
    }

    public abstract void Swim();
}

public class MallardDuck : Duck
{
    public MallardDuck()
    {
    }

    public MallardDuck(IFlyable fly, IQuackable quack)
    {
        Fly = fly;
        Quack = quack;
    }

    public override void Swim()
    {
        Console.WriteLine("Mallard Duck is Swimming");
    }
}


//No Fly and Quack behaviour by default
public class DecoyDuck : Duck
{
     public DecoyDuck()
     {
     }

     public DecoyDuck(IFlyable fly, IQuackable quack)
     {
         Fly = fly;
         Quack = quack;
     }

     public override void Swim()
     {
         Console.WriteLine("DecoyDuck Duck is Swimming");
     }
}

public interface IFlyable
{
     void Fly();
}

public class FlyWithWings : IFlyable
{
     public void Fly()
     {
         Console.WriteLine("You are flying with wings");
     }
}

public class RocketFly : IFlyable
{
    public void Fly()
    {
       Console.WriteLine("Rocket Powered Fly");
    }
}

public interface IQuackable
{
    void Quack();
}

public class RealQUack :IQuackable
{
   public void Quack()
   {
      Console.WriteLine("This is Real Quack");
   }
}

public class PowerQuack : IQuackable
{
    public void Quack()
    {
        Console.WriteLine("Powerful Quacking ");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Duck mallard = new MallardDuck
        {Fly=new FlyWithWings(),Quack=new RealQUack()}
        mallard.PerformQuack();
        mallard.PerformFly();

        // He can't Quack or Fly by default
        // So i am calling the default constructor.
        Duck decoy = new DecoyDuck();
        decoy.PerformQuack();
        decoy.PerformFly();

        // Adding behaviours on the fly

        decoy.Fly = new RocketFly();
        decoy.Quack = new PowerQuack();

        decoy.PerformQuack();
        decoy.PerformFly();   
        Console.Read();
    }
}