Study/Design Pattern

[Design pattern] 옵서버 패턴 (Observer pattern)

v명월v 2019. 6. 11. 22:43

안녕하세요. 명월입니다.

 

이 글은 옵서버 패턴에 대한 설명입니다.

 

옵서버 패턴은 Javascript에서 가장 많이 사용하는 패턴입니다. 그러나 Java나 C#에서도 lambda식, 이벤트, C++에서 함수 포인트를 사용하는 구조가 옵서버 패턴입니다.

간단하게 설명하면 callback의 구조가 옵서버 패턴이라고 생각하면 됩니다.

 

개인적으로 저는 정말 많이 사용하는 패턴 중에 하나입니다.

interface IObserver
{
  void CallBack(String data);
}

class Controller
{
  private string data = "Hello world";
  public void Execute(IObserver ob)
  {
    // 호출 당한 클래스의 Callback 함수를 호출한다.
    ob.CallBack(this.data);
  }
}

class Observer : IObserver
{
  private Controller controller = new Controller();
  public void Run()
  {
    controller.Execute(this);
  }
  // 위 Execute 함수가 호출되면 아래의 CallBack함수가 호출된다.
  public void CallBack(String data)
  {
    Console.WriteLine(data);
  }
}

class Program
{
  static void Main(string[] args)
  {
    var ob = new Observer();
    // 결과는 Hello world
    ob.Run();

    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}
##소스##
위 소스는 C#의 람다(lambda)를 사용하지 않고 기본적인 구조로 작성했습니다. Observer 클래스에서 Controller클래스의 Run을 호출하면 Observer 클래스의 Callback함수가 호출됩니다.
##소스##
// 델리게이트 (함수 포인터)
public delegate void CallBack(string sender);
class Controller
{
  // 함수의 void -- (String) 형식의 이벤트를 생성
  public event CallBack callback;
  private string data = "Hello world";
  public void Execute(Action<String> ob)
  {
    // C#의 이벤트 형식의 옵서버 패턴입니다.
    callback(data);
    
    // C#의 람다(lambda) 형식의 옵서버 패턴입니다.
    ob(data);
  }
}
class Observer
{
  private Controller controller = new Controller();
  public void Run()
  {
    // 이벤트 식의 옵서버 패턴, 결과는 Hello world입니다.
    controller.callback += (data) =>
    {
      Console.WriteLine(data);
    };

    // 람다(lambda) 식의 옵서버 패턴, 결과는 Hello world입니다.
    controller.Execute((data) =>
    {
      Console.WriteLine(data);
    });
  }
}

class Program
{
  static void Main(string[] args)
  {
    var ob = new Observer();
    // 결과는 Hello world /n Hello world
    ob.Run();

    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}

위 소스는 정말 C#스러운 옵서버 패턴입니다. lambda식의 경우는 java에서도 똑같이 사용합니다. java에서는 C#의 이벤트가 없기 때문에 람다(lambda)식으로 표현해야 겠네요.

여기까지 옵서버 패턴에 대한 설명이었습니다.

 

궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.