STUDY/Design Pattern

옵저버 패턴(Observer Pattern)

디리릭 2022. 12. 19. 01:53
728x90

객체의 상태변화를 관찰하는 옵저버를 객체에 등록하고 상태 변화가 있을 때 마다 메소드 등을 통해 옵저버에게 상태변화 했음을 알리는 디자인 패턴이다. 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보할 때 유용하다.

옵저버 또는 리스너라 불리는 하나 이상의 객첵를 관찰 대상이 되는 객체에 등록시킨다. 그리고 각각의 옵저버들은 관찰 대상인 객체가 발생시키는 이벤트를 받아 처리한다.

구조

▷ Observer: 데이터의 변경을 통보 받는 인터페이스. Subject에서는 Observer의 update를 호출하여 ConcreteSubject의 데이터 변경을 ConcreteObserver에 통보한다.

▷ Subject: ConcreteObserver 객체를 관리. Observer인터페이스를 참조하여 ConcreteObserver를 관리하기 때문에 서로 독립적이다.

▷ ConcreteSubject: 데이터 변경을 통보하는 클래스

▷ ConcreteObserver: ConcreteSubject의 변경을 통보 받는 클래스

구현

class Subject
    {
        List<IUpdate> observers = new List<IUpdate>();
        public void AddObserver(IUpdate observer)
        {
            observers.Add(observer);
        }
        public void RemoveObserver(IUpdate observer)
        {
            observers.Remove(observer);
        }
        public void Notify()
        {
            foreach (IUpdate observer in observers)
            {
                observer.Update();
            }
        }
    }
class Patient : Subject
    {
        public string Name
        {
            get;
            private set;
        }
        public bool Fav
        {
            get;
            private set;
        }
        public string Memo
        {
            get;
            private set;
        }
     
        public Patient(string name, bool fav, string memo)
        {
            Name = name;
            Fav = fav;
            Memo = memo;
        }
        public void Change(bool fav, string memo)
        {
            Fav = fav;
            Memo = memo;
            Notify();
        }
        public void View()
        {
            Console.WriteLine("환자이름", Name);
            Console.WriteLine("관심환자:", Fav);
            Console.WriteLine("관심메모:", Memo);
        }
    }
 interface IUpdate
    {
        void Update();
    }
 class PatFav : IUpdate
    {
        Patient patient;
        public PatFav(Patient patient)
        {
            this.patient = patient;
        }
        public void Update()
        {
            Console.WriteLine("이름:{0} \n관심환자 여부:{1}, \n관심메모:{2}", patient.Name, patient.Fav, patient.Memo);
        }
    }
  class PatMemo : IUpdate
    {
        Patient patient = null;
        public PatMemo(Patient patient)
        {
            this.patient = patient;
        }
        public void Update()
        {
            Console.WriteLine("이름:{0} \n관심환자 여부:{1}, \n관심메모:{2}", patient.Name, patient.Fav, patient.Memo);
        }
    }
   static void Main(string[] args)
        {
            Patient patient = new Patient("최유리", false, string.Empty);
            patient.View();
            IUpdate[] observers = new IUpdate[3];
            observers[0] = new PatFav(patient);
            observers[1] = new PatMemo(patient);
            patient.AddObserver(observers[0]);
            patient.AddObserver(observers[1]);
            patient.Change(true, "주의 바람");
            patient.Change(true, "=======\n변경된 메모->퇴원 요청");

            Console.Read();
        }
728x90

'STUDY > Design Pattern' 카테고리의 다른 글

프록시 패턴(Proxy Pattern)  (0) 2022.12.19
경량 패턴(Flyweight Pattern)  (0) 2022.12.19
퍼사드 패턴(Facade Pattern)  (0) 2022.12.15
장식자 패턴(Decorator Pattern)  (0) 2022.12.15
복합체 패턴(Composite Pattern)  (0) 2022.11.27