SimUDuck WPF Code


This entry is part 2 of 2 in the series Strategy Pattern

This post carries on from the previous post, but it completes most of the code in C# in the first chapter of Head First Design Patterns. Feel free to go ahead and copy this C# code and experiment with it.

I named my C# WPF .NET project SimUDuck2. Below are the code listings.

<Window x:Class="SimUDuck2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SimUDuck2"
        mc:Ignorable="d"
        Title="SimUDuck2 HeadFirst Design Patterns" Height="350" Width="500">
    <StackPanel Margin="10">
        <TextBlock>Chapter One - Intro</TextBlock>
        <TextBlock x:Name="txtBlk"></TextBlock>
        <TextBlock x:Name="txtBlk2"></TextBlock>
        <TextBlock x:Name="txtBlk3"></TextBlock>
        <TextBlock x:Name="txtBlk4"></TextBlock>
        <TextBlock x:Name="txtBlk5"></TextBlock>
        <TextBlock x:Name="txtBlk6"></TextBlock>
        <TextBlock x:Name="txtBlk7"></TextBlock>
        <TextBlock x:Name="txtBlk8"></TextBlock>
        <TextBlock x:Name="txtBlk9"></TextBlock>
        <TextBlock x:Name="txtBlk10"></TextBlock>
        <TextBlock x:Name="txtBlk11"></TextBlock>
        <TextBlock x:Name="txtBlk12"></TextBlock>
        <TextBlock x:Name="txtBlk13"></TextBlock>
    </StackPanel>
</Window>

The code behind.

using System.Windows;
namespace SimUDuck2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MallardDuck mallard = new MallardDuck();
            txtBlk.Text = mallard.display();
            txtBlk2.Text = mallard.performFly();
            txtBlk3.Text = mallard.swim();
            txtBlk4.Text = mallard.performQuack();

            RubberDuck rubber = new RubberDuck();
            txtBlk6.Text = rubber.display();
            txtBlk7.Text = rubber.performFly();
            txtBlk8.Text = rubber.performQuack();

            ModelDuck model = new ModelDuck();
            txtBlk10.Text = model.display();
            txtBlk11.Text = model.performFly();
            model.setFlyBehavior(new FlyRocketPowered());
            txtBlk12.Text = (model.performQuack() + " !!!").ToUpper();
            txtBlk13.Text = model.performFly();
            
        }
    }
}

IFlyBehavior.cs

namespace SimUDuck2
{
    public interface IFlyBehavior
    {
        public string fly();
    }
}

FlyWithWings.cs

namespace SimUDuck2
{
    public class FlyWithWings : IFlyBehavior
    {
        public string fly()
        {
            return "flying with wings... ";
        }
    }
}

FlyNoWay.cs

namespace SimUDuck2
{
    public class FlyNoWay : IFlyBehavior
    {
        public string fly()
        {
            return "no fly";  // not able to fly
        }
    }
}

FlyRocketPowered.cs

namespace SimUDuck2
{
    public class FlyRocketPowered : IFlyBehavior
    {
        public string fly()
        {
            return "I'm flying like a rocket!";
        }
    }
}

IQuackBehavior.cs

namespace SimUDuck2
{
    public interface IQuackBehavior
    {
        public string quack();
    }
}

Quack.cs

namespace SimUDuck2
{
    class Quack : IQuackBehavior
    {
        public string quack()
        {
            return "quack";
        }
    }
}

Squeak.cs

namespace SimUDuck2
{
    public class Squeak : IQuackBehavior
    {
        public string quack()
        {
            return "squeak squeak";
        }
    }
}

Duck.cs

namespace SimUDuck2
{
    public abstract class Duck
    {
        protected IFlyBehavior flyBehavior;
        protected IQuackBehavior quackBehavior;

        public string swim()
        {
            return "duck is swim swim swimming...";
        }
        public string performFly()
        {
            return flyBehavior.fly();
        }
        public string performQuack()
        {
            return quackBehavior.quack();
        }
        public void setFlyBehavior(IFlyBehavior fb)
        {
            flyBehavior = fb;
        }
        public void setQuackBehavior(IQuackBehavior qb)
        {
            quackBehavior = qb;
        }
    }
}

MallardDuck.cs

namespace SimUDuck2
{
    class MallardDuck : Duck
    {
        public MallardDuck()
        {
            flyBehavior = new FlyWithWings();  // polymorphism
            quackBehavior = new Quack();
        }
        public string display()
        {
            return "displaying Mallard Duck... ";
        }
    }
}

RubberDuck.cs

namespace SimUDuck2
{
    class RubberDuck : Duck
    {
        public RubberDuck()
        {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Squeak();
        }
        public string display()
        {
            return "displaying Rubber Duck... ";
        }
    }
}

ModelDuck.cs

namespace SimUDuck2
{
    public class ModelDuck : Duck
    {
        public ModelDuck()
        {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
        public string display()
        {
            return "displaying Model Duck... ";
        }
    }
}

Series Navigation<< Strategy Pattern SimUDuck Introduction