잊지 않겠습니다.

using System;
using System.Collections.Generic;

namespace ObserverPattern
{
  public interface IObserver
  {
    void Update(float temp, float humidity, float pressure);
  }

  public interface ISubject
  {
    void RegisterObserver(IObserver o);
    void RemoveObserver(IObserver o);
    void NotifyObservers();
  }

  public interface IDisplayElement
  {
    void Display();
  }


  public class WeatherSubject : ISubject
  {
    readonly List<IObserver> observers;
    float temperature;
    float pressure;
    float humidity;

    public void GetterMeasurements(float inTemperature, float inHumidity, float inPressure)
    {
      temperature = inTemperature;
      humidity = inHumidity;
      pressure = inPressure;
      NotifyObservers();
    }

    public WeatherSubject()
    {
      observers = new List<IObserver>();
    }
    #region ISubject Members

    public void RegisterObserver(IObserver o)
    {
      observers.Add(o);
    }

    public void RemoveObserver(IObserver o)
    {
      observers.Remove(o);
    }

    public void NotifyObservers()
    {
      foreach ( IObserver observer in observers )
      {
        observer.Update(temperature, humidity, pressure);
      }
    }

    #endregion
  }
}
Posted by Y2K
,

object의 생성부분을 처리하는 class를 factory로 한다. 

특정한 객체를 만들어서 넘겨줄때, 또는 객체를 생성하고, 준비하는 과정에 대한 기본적인 내용이 필요한 경우에 Factory를 만들어서 Factory에서 처리하도록 한다. 


 

using System;


namespace FactoryPattern1

{

  public interface IPizzaStore

  {

    Pizza OrderPizza(string pizzaName);

  }


  public interface IPizzaFactory

  {

    Pizza CreatePizza(string pizzaName);

  }


  public class MyHomePizzaFactory : IPizzaFactory

  {

    #region IPizzaFactory Members


    public Pizza CreatePizza(string pizzaName)

    {

      return new Pizza() { Name = pizzaName + " Sweet MyHome" };

    }


    #endregion

  }


  public class MyHomePizzaStore : PizzaStore, IPizzaStore

  {

    IPizzaFactory pizzaFactory;

    public MyHomePizzaStore(IPizzaFactory pizzaFactory)

    {

      this.pizzaFactory = pizzaFactory;

    }


    #region IPizzaStore Members


    public Pizza OrderPizza(string pizzaName)

    {

      Pizza pizza = pizzaFactory.CreatePizza(pizzaName);

      PreparePizza(pizza);

      CutPizza(pizza);


      //this method is changable : in my home, we eat pizza with no boxing.


      return pizza;

    }


    #endregion

  }


  public class HostwayPizzaFactory : IPizzaFactory

  {


    #region IPizzaFactory Members


    public Pizza CreatePizza(string pizzaName)

    {

      return new Pizza() { Name = pizzaName + " HostwayPizza" };

    }


    #endregion

  }

  public class HostwayPizzaStore : PizzaStore, IPizzaStore

  {

    IPizzaFactory pizzaFactory;


    public HostwayPizzaStore(IPizzaFactory pizzaFactory)

    {

      this.pizzaFactory = pizzaFactory;

    }


    #region IPizzaStore Members


    public Pizza OrderPizza(string pizzaName)

    {

      Pizza pizza = pizzaFactory.CreatePizza(pizzaName);

      PreparePizza(pizza);

      CutPizza(pizza);

      BoxingPizza(pizza);

      return pizza;

    }


    #endregion

  }


  public abstract class PizzaStore

  {

    public string CutPizza(Pizza pizza)

    {

      return "Cutting Pizza";

    }


    public string PreparePizza(Pizza pizza)

    {

      return "Prepare Pizza";

    }


    public string BoxingPizza(Pizza pizza)

    {

      return "Boxing pizza";

    }

  }


  public class Pizza

  {

    public string Name { get; set; }

  }

}

Posted by Y2K
,

복잡한 여러개의 Interface를 단순화하기 위한 Pattern.

하나이상의 Class의 복잡한 interface를 단순한 Facade로 덮어주는 Pattern.

  

용도에 따른 변경에 주안점을 주게 된다 : 하나의 복잡한 일을 하는 것에 대한 쉬운 접근 방법의 제공 

단순화된 인터페이스를 제공하면서도, 클라이언트에서 필요로 한다면 sub class의 모든 기능을 제공할 수 있어야지 된다. 

  

  

  public interface IHomeTheaterFacade

  {

    void TurnOnMovie();

    void TurnOffMovie();

  }


  public class HomeTheaterFacade : IHomeTheaterFacade

  {

    object amp;

    object tuner;

    object dvdPlayer;

    object dvd;

    object projector;

    object screen;


    public HomeTheaterFacade(object amp, object tuner, object dvdPlayer, object dvd, object projector, object screen)

    {

      this.amp = amp;

      this.tuner = tuner;

      this.dvdPlayer = dvdPlayer;

      this.dvd = dvd;

      this.projector = projector;

      this.screen = screen;

    }


    #region IHomeTheaterFacade Members


    public void TurnOnMovie()

    {

      //Note : Do some thing      

    }


    public void TurnOffMovie()

    {

      //Note : Do some thing

    }


    #endregion

  } 

Posted by Y2K
,