디자인 패턴 - 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