using System.Collections.Generic;
public static void Main()
ICollection<IDuck> flock = new List<IDuck>();
IDuck ninjaDuck = new Duck(new SilentQuacking(), new StealthFlying());
IDuck noisyDuck = new Duck(new LoudQuacking(), new LoudFlying());
GoatToDuckAdapter adapter = new GoatToDuckAdapter(goat);
IDuck duckFlock = new DuckFlock(flock);
IObserver flyingDuckObserver = new FlyingDuckObserver();
DuckSimulator sim = new DuckSimulator(duckFlock);
sim.Subscribe(flyingDuckObserver);
public class DuckSimulator : IObservable {
private ICollection<IObserver> observers;
public DuckSimulator(IDuck duck){
this.observers = new List<IObserver>();
public void MakeDuckFly(){
foreach(var o in observers){
public void MakeDuckQuack(){
public void Subscribe(IObserver obs){
public void Unsubscribe(IObserver obs){
public class FlyingDuckObserver : IObserver {
Console.WriteLine("*sees a duck flying");
public class QuackingDuckObserver : IObserver {
Console.WriteLine("*hears a duck quacking");
public class Duck : IDuck {
private IQuackBehavior quack;
private IFlyBehavior fly;
public Duck(IQuackBehavior q, IFlyBehavior f){
public class DuckFlock : IDuck {
private ICollection<IDuck> ducks;
public DuckFlock(ICollection<IDuck> ducks){
foreach(var duck in ducks){
foreach(var duck in ducks){
public interface IQuackBehavior {
public class LoudQuacking : IQuackBehavior {
Console.WriteLine("*Louud Quacking noises");
public class SilentQuacking : IQuackBehavior {
Console.WriteLine("*Silent Quacking noises");
public interface IFlyBehavior {
public class StealthFlying : IFlyBehavior {
Console.WriteLine("*Silently flying");
public class LoudFlying : IFlyBehavior {
Console.WriteLine("*Noisily flying");
public interface IDuck : IQuackBehavior, IFlyBehavior {
public void MakeGoatSound(){
Console.WriteLine("Meeeh-ee-ee-ee");
public class GoatToDuckAdapter : IDuck {
public GoatToDuckAdapter(Goat goat){
Console.WriteLine("*Jumping while ears flapping noises");
public interface IObservable {
void Subscribe(IObserver obs);
void Unsubscribe(IObserver obs);
public interface IObserver {