kohigowild
μ΅μ λ² ν¨ν΄κ³Ό μμ μ½λ λ³Έλ¬Έ
π½ Observer Pattern
μ΅μ λ² ν¨ν΄(Observer Pattern)μ μ΄λ€ μ΄λ²€νΈκ° μΌμ΄λλ κ²μ κ°μνλ ν¨ν΄μ μλ―Ένλ€. ν¨μλ‘ μ§μ μμ²ν μ μμ§λ§ μμ€ν
μ μν΄ λ°μνλ λμλ€μ μ΄λ²€νΈλΌ νλλ°, μ΄λ¬ν μ΄λ²€νΈλ€μ κ°μνμ¬ μ΄λ²€νΈκ° λ°μν λλ§λ€ 미리 μ μν΄ λ μ΄λ ν λμμ μ¦κ° μννκ² ν΄ μ£Όλ νλ‘κ·Έλλ° ν¨ν΄μ μ΅μ λ² ν¨ν΄μ΄λΌ νλ€. μμλ‘ A λ²νΌμ΄ ν΄λ¦λ λλ§λ€ νλ©΄μ 'μλ
'μ μΆλ ₯νλ λμμ λ€ μ μλ€.
μ΅μ λ² ν¨ν΄μ νμ©νλ©΄ λ€λ₯Έ κ°μ²΄μ μν λ³νλ₯Ό λ³λμ ν¨μ νΈμΆ μμ΄ μ¦κ°μ μΌλ‘ μ μ μκΈ° λλ¬Έμ, μ΄λ²€νΈμ λν μ²λ¦¬λ₯Ό μμ£Ό ν΄μΌ νλ νλ‘κ·Έλ¨μ΄λΌλ©΄ λ§€μ° ν¨μ¨μ μΈ νλ‘κ·Έλ¨μ μμ±ν μ μλ€.
Modelμ μνκ° λ³κ²½λλ©΄ μ΄λ₯Ό ꡬλ
νκ³ μλ Viewμ λ λλ§ ν¨μ(or λ±λ‘ν΄ λμ ν¨μ)κ° μ€νλλ€. μνκ° λ³κ²½λ¨μ λ°λΌ Viewλ μλμΌλ‘ λ λλ§μ΄ λλ ꡬ쑰μ΄λ€.
π½ Observer Pattern μ½λ
export default class Observer {
constructor() {
this._observers = new Set();
}
subscribe(observer) {
this._observers.add(observer);
}
notify() {
this._observers.forEach((observer) => observer());
}
}
- _observers: κ° Viewμμ λ±λ‘ν render λ©μλκ° μ μ₯λ κ³³μ΄λ€.
- subscribe: Viewμμ render λ©μλλ₯Ό λ±λ‘νλ ν¨μμ΄λ€.
- notify: Modelμ μνκ° λ³κ²½μ΄ λ λ, Viewκ° λ±λ‘ν render ν¨μλ€μ νΈμΆνλ ν¨μμ΄λ€.
Model (μμ ν¨μλ₯Ό μμλ°μ)
export default class TextModel extends Observer {
constructor() {
super();
this.text = "hello world";
}
getText() {
return this.text;
}
setText(text) {
this.text = text;
this.notify();
}
}
- getText: νμ¬ μνλ₯Ό λ°ννλ€.
- setText: νμ¬ μνλ₯Ό λ°μ μΈμλ‘ λ³κ²½μν€κ³ λ±λ‘λ render ν¨μλ€μ νΈμΆνλ€.
View (μμ Model ꡬλ )
export default class TextView {
constructor({ model }) {
this.$target = document.createElement("div");
this.textModel = model;
this.textModel.subscribe(this.render.bind(this)); //Modelμ ꡬλ
this.render();
}
render() {
const text = this.textModel.getText(); //Modelμ μνλ₯Ό κ°μ Έμμ λ λλ§
this.$target.innerHTML = `
<div>${text}</div>
`;
}
View λ³κ²½ λ²νΌ
export default class ChangeTextBtn {
constructor({ model }) {
this.$target = document.createElement("div");
this.textModel = model;
this.render();
this.$target.addEventListener("click", this.handleClick.bind(this));
}
render() {
this.$target.innerHTML = `
<input tpye='text' />
<button>text λ³κ²½!</button>
`;
}
handleClick({ target }) {
if (target.tagName !== "BUTTON") return;
const input = this.$target.querySelector("input");
this.textModel.setText(input.value);
input.value = "";
}
}
π½ Reference
https://codesandbox.io/s/keulraeseuhyeong-objeobeopaeteon-ikkod?from-embed
'JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νΈμ΄μ€ν κ°λ¨νκ² μ 리 (0) | 2023.04.21 |
---|---|
λ°λλΌ JSλ‘ μΉ μ»΄ν¬λνΈ λ§λ€κΈ° (0) | 2022.12.11 |
JavaScript fetch() (0) | 2022.11.27 |
JavaScript λ¬Έμ κ°μ²΄ λͺ¨λΈ(DOM) (0) | 2022.11.16 |
JavaScript ES6 λͺ¨λ (0) | 2022.10.29 |