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)식으로 표현해야 겠네요.
여기까지 옵서버 패턴에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.