블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday

'GOF 디자인 패턴'에 해당되는 글 1건

  1. 2011.10.23 옵저버 패턴(Observer pattern)





 
옵저버 패턴(Observer pattern) 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락을 주고, 자동으로 해당 객체들의 내용이 갱신이 되도록 하는 방식으로 일대다(ont-to-many) 의존성을 정의 한다. 일반적으로 분산 이벤트 처리를 목적으로 많이 사용한다고 한다. 아래는 예제로 보여줄 옵저버 패턴의 클래스 다이어그램(Class diagram)과 프로젝트 파일들을 나타낸 것이다.
(참고로 현재 예제코드는 윈품(WinForm)프로젝트로 만들어 보았다. )


 위 그림에 보면, 3개의 인터페이스(Interface)가 있고, 이 인터페이스 상속받아 구현한 객체가 있다. 좀더 자세히 보면 CountObserverCenter라는 녀석은 IObserverCenter 인터페이스를 상속 받아 구현되었다. 그리고 Screen1, Screen2는 IScreen 인터페이스를 상속받아 구현되었으며, IObserver 인터페이스를 상속 받아 구현되었다. (C#에서는 인터페이스 다중 상속이 된다는 걸 알고 있을 것이다.) Screen1과 Screen2는 UserControl이다. 그럼 각각의 객체의 역활및 소스코드에 대해서 알아 보도록 하겠다.

1. IObserverCenter와 CountObserverCenter

 - IObserverCenter는 Observer들의 추가, 삭제, 알림 기능을 할 수 있는 인터페이스만 정의 되어 있다.



 - CountObserverCenter는 IObserverCenter 인터페이스를 상속받았으므로, 추가,삭제, 알림 기능을 하는 메소드를 구현해 준다. 즉, 실질적으로 작동이 되도록 정의하는 것이다. CountObserverCenter의 역활은 특정 액션이 전달되면 각각의 Observer들에게 카운트를 증가시키라는 알림을 알려주는 역활을 하는데, 이는 _count와 _observerLIst 맴버를 이용하게 된다. 아래 소스를 보면 이해하기 쉬울 것이다.



2. IObserver와 IScreen 그리고 Screen1,Screen2

 - IObserver는 옵져버 센터에서 연락을 받을 수 있는 인터페이스만 정의 되어 있다. 다시말해 NotifyAction메소드를 통해서 알람 내용을 정의 할수 있는 것이다.



 - IScreen은 Screen1,Screen2가 공통으로 정의될 내용의 인터페이스가 정의 되어 있다. UpdateScreen 메소드를 통해서 해당 Screen의 내용이 갱신되도록 정의한다.



 - Screen1과 Screen2는 UserControl로서 IOserver 인터페이스와 IScreen 인터페이스의 내용을 상속받아 동작 내용을 정의 한다. 즉, IOserver 인터페이스의 NotifyAction 메소드가 호출되었을 때 작동해야할 내용을 정의하며, IScreen 인터페이스의 UpdateScreen 메소드가 호출되었을 때 내용을 정의 한다. (코드 설명은 주석을 참고 하기 바란다.)




위 그림은 Screen1과 Screen2의 디자인 모습인데, 간단하다. Panel Control 위에 Label Control를 올려 놓은 것이다. 그리고 소스는 Screen1에 대해서만 올려 졌는데, 그 이유는 Screen2또한 같은 소스 코드기 때문에 생략 한 것 이다.

자 그럼 위 내용 처럼 ObserverCenter와 Obsever가 준비되 었다면, 메인 폼(Form)에서 내용을 정의하고 실행 시켜보도록 하겠다. 우선, 메인 폼에 대한 디자인 모습은 아래와 같다.



간단한 디자인이다. 샘플이므로... 버튼이 하나 올려져 있는데, 이 버튼을 클릭할때 마다 Screen1과 Screen2의 Count를 증가 시켜줄 것이다. 그리고 SplitContainer Control이 있는데, 이는 Screen1과 Screen2를 올려 놓을 컨테이너이다. 그럼 폼의 코드를 살펴 보자.



폼에서는 간략하게 생성자에서 유저컨트롤들의 인스턴스를 생성해서, 추가시켜주는 내용과 버튼 이벤트를 받아서 알림 액션을 처리하는 내용 뿐이다. 생성자에서 CountObserverCenter를 인스턴스로 생성을하고 Screen1과 Screen2의 파라미터로 넘겨 주는 데, CountObserverCenter는 참조타입(Reference type)이기 때문에 객체의 주소값이 넘어 가게 된다. 이를 Screen1,2에서 받아서 맴버로 가지고 있기때문에 알람 액션에 대한 내용 전달 받을 수 있고, 처리할수 있는 것 이다.

해당 예제소스는 첨부파일로 첨부되어 있다. 다운 받아 확인 할수 있을 것이다.

Posted by happydong
, |