디자인 패턴 - Observer Pattern
2021. 4. 1. 17:46ㆍ개발 관련 학습정리/C#
반응형
Observer Pattern
한 객체에 상태가 변경될 경우 그 객체에 의존하는 다른 객체들한테 연락을 하고,
자동으로 하위 객체들의 내용이 갱신된다.
UML Diagram
데이터의 주인은 subject이고, observer들은 데이터가 변경되었을 때 subject에서 갱신하기를 기다린다.
전달할 데이터 형식은 subject를 상속하여 정의한다.
패턴 구현
Subject
public abstract class Subject
{
private List<Observer> observers = new List<Observer>();
public void AddView(Observer observer)
{
observers.Add(observer);
}
public void RemoveView(Observer observer)
{
observers.Remove(observer);
}
public void NotifyView()
{
foreach (Observer observer in observers)
{
observer.Update();
}
}
}
Subject에는 데이터를 제공할 옵저버들의 리스트를 담고, 리스트를 수정할 수 있는 메서드를 정의한다.
또한 이벤트 발생시 Notify를 이용하여 옵저버들의 update를 호출시킨다.
User Object
public class RectInfo : Subject
{
public Point Startpos { get; set; }
private Point _endpos;
public Point Endpos
{
get { return _endpos; }
set
{
_endpos = value;
NotifyView();
}
}
}
실제로 전송될 데이터를 담고 있는 유저 오브젝트를 정의하고, setter에서 Notify를 정의함으로서
값을 수정함과 동시에 observer들에게 값을 전송한다.
Observer
public interface Observer
{
void Update();
}
Observer 인터페이스에는 값을 갱신하는 update 메서드를 정의한다.
기본적인 패턴 구성은 위 3가지로 이루어져있고, 실제 폼에서 Observer를 상속받고 메인에서 추가시키는 작업을 해야한다.
옵저버 호출과 구현
Observer Form
public partial class Form1 : Form, Observer // observer 상속
{
RectInfo rectinfo;
public Form1(RectInfo _rectinfo)
{
rectinfo = _rectinfo;
InitializeComponent();
}
public void Update()
{
startposLabel.text = rectinfo.Startpos;
endposLabel.text = rectinfo.Endpos;
}
}
생성자에서 외부의 객체를 받고 Update가 외부에 호출될때마다 데이터가 갱신된다.
Mainform
public partial class Mainform : Form
{
Form1 form1 = null;
Form2 form2 = null;
RectInfo rectinfo = new RectInfo();
public Mainform()
{
form1 = new Form1(RectInfo) //RectInfo값이 전달된 하위폼 생성
form2 = new Form2(RectInfo)
rectinfo.Addview(form1); // 그 하위폼을 Observer 리스트에 추가
rectinfo.Addview(form2);
}
private void picturebox_click(object sender, MouseEventArgs e)
{
rectinfo.Endpos = new Point(e.X, e.Y); //Notify 호출
...
}
하위 폼을 데이터를 받는 observer 리스트에 추가시키고,
객체가 수정될 때 notify를 호출시켜 하위폼에서 갱신되도록 한다.
이렇게 1:N 관계가 성립되어 메인에서 정보가 수정될 경우,
n개의 하위 클래스에서 동시에 데이터 갱신이 가능하다.
반응형
'개발 관련 학습정리 > C#' 카테고리의 다른 글
디자인 패턴 - 싱글톤 (Singleton) (0) | 2021.04.01 |
---|---|
C# 람다 식 Lambda (0) | 2021.01.27 |
C# Generic (0) | 2021.01.27 |
C# 추상클래스와 인터페이스 (0) | 2021.01.26 |
C# Delegate (0) | 2021.01.25 |