옵져버패턴
옵져버에 대해 글을 남기게 되었다. 최근 다시 디자인 패턴을 보게 되었는데, 다른 패턴들은 그저 확인정도지만,
옵져버는 그동안 긴가민가! 했던 패턴이라 다시 자세히 보게 되었다.
모니터링을 만들때 각 서버에 데이타 수집받으며, 데이타를 챠트로 표시하는곳, 표시박스에 표기하거나
라인색을 표시하거나 하는 곳으로 모두 전달했는데, 여기 사용하던 패턴이 잘 못 적용되었다. 옵져버 패턴을 제대로
이해 못하고 만든거라서 설계에서 꼬여버린 케이스같다.
음... 처음 컨셉은 저랬는데... 옵져버 패턴을 잘 못 적용했넹...
동작은 되지만... 옵져버가 서로 뒤바꼈던것 같다.
데이타객체가 바뀌면 관련 객체를 업데이트 한다였는데... 소스는 좀 꼬였던것 같고..
간략하게 옵져버 패턴용 소스를 만들어봤다. 이젠 혼란스럽지 않겠지..
public interface IData
{
void Add(IHandler handler);
void Remove(IHandler handler);
void Notify();
}
public interface IHandler
{
void Update();
}
public class DataObject : IData
{
List<IHandler> handlers = new List<IHandler>();
public void Add(IHandler handler)
{
handlers.Add(handler);
}
public void Remove(IHandler handler)
{
handlers.Add(handler);
}
public void Notify()
{
foreach (IHandler h in handlers)
{
h.Update();
}
}
string text { get; set; }
public string Text { get { return text; } set { text = value; Notify(); } }
}
public class View : IHandler
{
static int Number = 0;
int No = 0;
public View()
{
No = Number++;
}
public DataObject Sv { get; set; }
public Control HostControl { get; set; }
public void Update()
{
if (HostControl != null && Sv != null) HostControl.Text = No+"]"+ Sv.Text;
}
}
// 사용
DataObject sv = new DataObject();
// 등록
sv.Add(new View() { Sv = sv, HostControl = label1 });
sv.Add(new View() { Sv = sv, HostControl = label2 });
sv.Add(new View() { Sv = sv, HostControl = label3 });
// 상태 업데이트 발생 이벤트 시점!
sv.Text = "가나다";