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 |