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