principlecsharpMinor
Strategy Pattern
Viewed 0 times
patternstrategystackoverflow
Problem
I am working on going through "Head First Design Patterns" and I am trying to properly convert the Java code into C#. Here is what I have. Can you tell me if this is a good implementation/conversion so far?
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Duck
{
public abstract class Duck
{
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
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 interface FlyBehavior
{
void fly();
}
public class FlyWithWings : FlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying!");
}
}
public class FlyNoWay : FlyBehavior
{
public void fly()
{
Console.WriteLine("I can't fly!");
}
}
public interface QuackBehavior
{
void quack();
}
public class Quack : QuackBehavior
{
public void quack()
{
Console.WriteLine("Quack");
}
}
public class MuteQuack : QuackBehavior
{
public void quack()
{
Console.WriteLine(">");
}
}
public class Squeak : QuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak");
}
}
public class MallardDuck : Duck
{
public MallardDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public override void display()
{
Console.WriteLine("I'm a real Mallard duck");
}
}
public class MiniDuckSimulator
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Duck
{
public abstract class Duck
{
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
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 interface FlyBehavior
{
void fly();
}
public class FlyWithWings : FlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying!");
}
}
public class FlyNoWay : FlyBehavior
{
public void fly()
{
Console.WriteLine("I can't fly!");
}
}
public interface QuackBehavior
{
void quack();
}
public class Quack : QuackBehavior
{
public void quack()
{
Console.WriteLine("Quack");
}
}
public class MuteQuack : QuackBehavior
{
public void quack()
{
Console.WriteLine(">");
}
}
public class Squeak : QuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak");
}
}
public class MallardDuck : Duck
{
public MallardDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public override void display()
{
Console.WriteLine("I'm a real Mallard duck");
}
}
public class MiniDuckSimulator
Solution
public fields are a bit of a no-no since that violates encapsulation. So I've changed the fields to private readonly and inject those dependencies via the constructor. Speaking of constructor, I made it protected as a public constructor on an abstract class doesn't make much sense. Also, make note of C# naming conventions which PascalCase's methods and that interfaces should start with "I":using System;
namespace Duck
{
public abstract class Duck
{
private readonly IFlyBehavior flyBehavior;
private readonly IQuackBehavior quackBehavior;
protected Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior)
{
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
public abstract void Display();
public void PerformFly()
{
this.flyBehavior.Fly();
}
public void PerformQuack()
{
this.quackBehavior.Quack();
}
public void Swim()
{
Console.WriteLine("All ducks float, even decoys!");
}
}
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(">");
}
}
public class Squeak : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("Squeak");
}
}
public class MallardDuck : Duck
{
public MallardDuck() : base(new FlyWithWings(), new Quack())
{
}
public override void Display()
{
Console.WriteLine("I'm a real Mallard duck");
}
}
public class MiniDuckSimulator
{
public static void Main(string[] args)
{
Duck mallard = new MallardDuck();
mallard.PerformQuack();
mallard.PerformFly();
Console.ReadLine();
}
}
}Code Snippets
using System;
namespace Duck
{
public abstract class Duck
{
private readonly IFlyBehavior flyBehavior;
private readonly IQuackBehavior quackBehavior;
protected Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior)
{
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
public abstract void Display();
public void PerformFly()
{
this.flyBehavior.Fly();
}
public void PerformQuack()
{
this.quackBehavior.Quack();
}
public void Swim()
{
Console.WriteLine("All ducks float, even decoys!");
}
}
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 Squeak : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("Squeak");
}
}
public class MallardDuck : Duck
{
public MallardDuck() : base(new FlyWithWings(), new Quack())
{
}
public override void Display()
{
Console.WriteLine("I'm a real Mallard duck");
}
}
public class MiniDuckSimulator
{
public static void Main(string[] args)
{
Duck mallard = new MallardDuck();
mallard.PerformQuack();
mallard.PerformFly();
Console.ReadLine();
}
}
}Context
StackExchange Code Review Q#29384, answer score: 6
Revisions (0)
No revisions yet.