퇴근5분전

# 5) 디자인패턴(for .NET )/Observer +1

 

 옵져버에 대해 글을 남기게 되었다. 최근 다시 디자인 패턴을 보게 되었는데, 다른 패턴들은 그저 확인정도지만,

옵져버는 그동안 긴가민가! 했던 패턴이라 다시 자세히 보게 되었다.

 

 모니터링을 만들때 각 서버에 데이타 수집받으며, 데이타를 챠트로 표시하는곳, 표시박스에 표기하거나

라인색을 표시하거나 하는 곳으로 모두 전달했는데, 여기 사용하던 패턴이 잘 못 적용되었다. 옵져버 패턴을 제대로

이해 못하고 만든거라서 설계에서 꼬여버린 케이스같다.

 

 

 

 

음... 처음 컨셉은 저랬는데... 옵져버 패턴을 잘 못 적용했넹...

 

동작은 되지만... 옵져버가 서로 뒤바꼈던것 같다.

 

데이타객체가 바뀌면 관련 객체를 업데이트 한다였는데... 소스는 좀 꼬였던것 같고..

 

 

간략하게 옵져버 패턴용 소스를 만들어봤다. 이젠 혼란스럽지 않겠지..  

 

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 = "가나다";