ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์ฐ๋ฝ์ด ๊ฐ๊ณ ์๋์ผ๋ก ๋ด์ฉ์ด ๊ฐฑ์ ๋๋ ๋ฐฉ์.
์ฃผ์ ์ ์ต์ ๋ฒ๊ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ ๊ฐ์ฒด ๋์์ธ.
Subject๊ฐ Observer์ ๋ํด์ ์๋ ๊ฒ์ Observer๊ฐ ํน์ ์ธํฐํ์ด์ค(Observer ์ธํฐํ์ด์ค)๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ ๋ฟ.
Observer๋ ์ธ์ ๋ ์ง ์๋ก ์ถ๊ฐํ ์ ์์.
์๋ก์ด ํํ์ Observer๋ฅผ ์ถ๊ฐํ๋ ค ํด๋ Subject๋ฅผ ์ ํ ๋ณ๊ฒฝํ ํ์๊ฐ ์์.
์๋ก์ด ํด๋์ค์์ Observer ์ธํฐํ์ด์ค๋ง ๊ตฌํํด์ฃผ๋ฉด ๋จ.
Subject๋ Observer๊ฐ ๋ฐ๋๋๋ผ๋ ์๋ก์๊ฒ ์ ํ ์ํฅ์ ์ฃผ์ง ์์. ๊ทธ๋์ Subject์ Observer๋ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์์.
1. ๊ธฐ๋ณธ ํธ์ถ
//์ต์ ๋ฒ ์ถ์ํด๋์ค
//: ์ต์ ๋ฒ๋ค์ด ๊ตฌํํด์ผ ํ ์ธํฐํ์ด์ค ๋ฉ์๋
public abstract class Observer
{
public abstract void OnNotify();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver1 : Observer
{
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify()
{
Debug.Log("์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #1");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver2 : Observer
{
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify()
{
Debug.Log("์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #2");
}
}
//๋์ ์ธํฐํ์ด์ค
//: ์ต์ ๋ฒ ๊ด๋ฆฌ, ํ์ฉ์ ๊ดํ ํ์
์ ์
public interface ISubject
{
void AddObserver(Observer o);
void RemoveObserver(Observer o);
void Notify();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//๋์ ํด๋์ค
//: ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค
public class ConcreteSubject : MonoBehaviour, ISubject
{
List<Observer> observers = new List<Observer>(); //์ต์ ๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ List
//๊ด๋ฆฌํ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋ก
public void AddObserver(Observer observer)
{
observers.Add(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ๋ฅผ ์ญ์
public void RemoveObserver(Observer observer)
{
if(observers.IndexOf(observer) > 0) observers.Remove(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ์๊ฒ ์ฐ๋ฝ
public void Notify()
{
foreach(Observer o in observers)
{
o.OnNotify();
}
}
void Start()
{
Observer obj1 = new ConcreteObserver1();
Observer obj2 = new ConcreteObserver2();
AddObserver(obj1);
AddObserver(obj2);
}
}
2. ํธ์ถ & ๊ฐ ๋๊ธฐ๊ธฐ: ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ
//์ต์ ๋ฒ ์ถ์ํด๋์ค
//: ์ต์ ๋ฒ๋ค์ด ๊ตฌํํด์ผ ํ ์ธํฐํ์ด์ค ๋ฉ์๋
public abstract class Observer
{
public abstract void OnNotify(int num);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver1 : Observer
{
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify(int num)
{
Debug.Log($"์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #1 : {num}");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver2 : Observer
{
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify(int num)
{
Debug.Log($"์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #2 : {num}");
}
}
//๋์ ์ธํฐํ์ด์ค
//: ์ต์ ๋ฒ ๊ด๋ฆฌ, ํ์ฉ์ ๊ดํ ํ์
์ ์
public interface ISubject
{
void AddObserver(Observer o);
void RemoveObserver(Observer o);
void Notify();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//๋์ ํด๋์ค
//: ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค
public class ConcreteSubject : MonoBehaviour, ISubject
{
List<Observer> observers = new List<Observer>(); //์ต์ ๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ List
private int myNum; //์ต์ ๋ฒ์๊ฒ ์ ๋ฌํ ๊ฐ
//๊ด๋ฆฌํ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋ก
public void AddObserver(Observer observer)
{
observers.Add(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ๋ฅผ ์ญ์
public void RemoveObserver(Observer observer)
{
if(observers.IndexOf(observer) > 0) observers.Remove(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ์๊ฒ ์ฐ๋ฝ & ๊ฐ ์ ๋ฌ
public void Notify()
{
foreach(Observer o in observers)
{
o.OnNotify(int num);
}
}
void Start()
{
myNum = 10;
Observer obj1 = new ConcreteObserver1();
Observer obj2 = new ConcreteObserver2();
AddObserver(obj1);
AddObserver(obj2);
}
}
3. ํธ์ถ & ๊ฐ ๋๊ธฐ๊ธฐ: ์ต์ ๋ฒ๋ฅผ ์์ฑํ ๋ Subject๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋ ๋ฐฉ๋ฒ
//์ต์ ๋ฒ ์ถ์ํด๋์ค
//: ์ต์ ๋ฒ๋ค์ด ๊ตฌํํด์ผ ํ ์ธํฐํ์ด์ค ๋ฉ์๋
public abstract class Observer
{
public abstract void OnNotify();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver1 : Observer
{
GameObject obj;
//์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด ์ ๋ฌ
public ConcreteObserver1(GameObject obj)
{
this.obj = obj;
}
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify()
{
int num = obj.gameObject.GetComponent<ConcreteSubject>().GetNum();
Debug.Log($"์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #1 : {num}");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//์ต์ ๋ฒ ๊ตฌํํด๋์ค
public class ConcreteObserver2 : Observer
{
GameObject obj;
//์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด ์ ๋ฌ
public ConcreteObserver2(GameObject obj)
{
this.obj = obj;
}
//๋์ํ์
์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์คํ์ํด
public override void OnNotify()
{
int num = obj.gameObject.GetComponent<ConcreteSubject>().GetNum();
Debug.Log($"์ต์ ๋ฒ ํด๋์ค์ ๋ฉ์๋ ์คํ #2 : {num}");
}
}
//๋์ ์ธํฐํ์ด์ค
//: ์ต์ ๋ฒ ๊ด๋ฆฌ, ํ์ฉ์ ๊ดํ ํ์
์ ์
public interface ISubject
{
void AddObserver(Observer o);
void RemoveObserver(Observer o);
void Notify();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//๋์ ํด๋์ค
//: ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค
public class ConcreteSubject : MonoBehaviour, ISubject
{
List<Observer> observers = new List<Observer>(); //์ต์ ๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ List
private int myNum; //์ต์ ๋ฒ์๊ฒ ์ ๋ฌํ ๊ฐ
//๊ด๋ฆฌํ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋ก
public void AddObserver(Observer observer)
{
observers.Add(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ๋ฅผ ์ญ์
public void RemoveObserver(Observer observer)
{
if(observers.IndexOf(observer) > 0) observers.Remove(observer);
}
//๊ด๋ฆฌ์ค์ธ ์ต์ ๋ฒ์๊ฒ ์ฐ๋ฝ & ๊ฐ ์ ๋ฌ
public void Notify()
{
foreach(Observer o in observers)
{
o.OnNotify();
}
}
void Start()
{
myNum = 10;
Observer obj1 = new ConcreteObserver1(this.gameObject);
Observer obj2 = new ConcreteObserver2(this.gameObject);
AddObserver(obj1);
AddObserver(obj2);
}
public int GetNum()
{
return myNum;
}
}
'๐ Computer Science > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity][๋์์ธ ํจํด] Simple Factory Pattern(์ฌํ ํฉํ ๋ฆฌ ํจํด) (0) | 2023.09.13 |
---|---|
[Unity][๋์์ธ ํจํด] Component Pattern (0) | 2023.09.12 |
[C#][Unity][๋์์ธ ํจํด] Strategy Pattern(์ ๋ต ํจํด) (0) | 2023.09.05 |
[C#][Unity][๋์์ธ ํจํด] Command ํจํด (0) | 2023.09.05 |