2012-01-30 9 views
3

私はStartegyでHead First Duckの問題を実装しようとしました。私はデコイダックを実装しようとしています。デコイダックは、クワックやフライの施設がないため、デフォルトのコンストラクタを呼び出すことによって実装されています(このダックにはFlyまたはQuackの機能がありません)。他のすべてのダックは、オーバーライドされたコンストラクタを呼び出すことによって初期化されます。本では、Flyがないアヒルは、IFlyインターフェイスを実装するFlyNoFlyクラスで実装されています。これは正しい戦略の実装です

私のソリューションでは、私はこのクラスを使用していません。代わりに、私は基本的なアヒルのクラスをチェックしていますか?有効なインスタンスが渡されたかどうか(if(Fly!= null))。Flyに有効な参照がある場合は、その。私は、デフォルトのメッセージを投げていそうで。

私は私の実装では、これが有効な実装であるかどうかは任意の設計原理を/違反しているかどうかを知りたい。

おかげ TutuMon

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(); 
    } 
} 
+0

私はStackExchangeサイト[コードレビュー](http://codereview.stackexchange.com)がこの種の質問に適していると思います。 –

答えて

1

いいえ、これは正しい実装ではありません。

戦略パターンは、オブジェクト指向コードでif (..)の使用を避けるために使用されます。 FlyNoFlyクラスを使用する場合は、if (null)チェックを避け、すべてのDuckオブジェクトに対して同じコンストラクターを使用できます。

+0

お返事ありがとうございます。私はここのコンストラクタを心配していませんし、コードからすべてのコンストラクタを削除することもできます。 – Tutu

関連する問題