728x90
반응형
옵저버 패턴(Observer Pattern)은 옵저버(관찰자)들이 관찰하고 있는 대상자의 상태가 변화가 있을 때마다 대상자는 직접 목록의 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 행동 패턴이다.
interface Observer {
update(subject: Subject): void;
}
class ConcreteObserever implements Observer {
constructor(private id: number) {}
public update(subject: Subject): void {
console.log(
`Observer ${this.id} updated, new state: ${subject.getState()}`
);
}
}
interface Subject {
addObserver(observer: Observer): void;
removeObserver(observer: Observer): void;
notifyObservers(): void;
getState(): number;
setState(state: number): void;
}
class ConcreteSubject implements Subject {
private observers: Observer[] = [];
private state: number = 0;
public addObserver(observer: Observer): void {
const isExists = this.observers.includes(observer);
if (isExists) {
return console.log("Observer already exists");
}
this.observers.push(observer);
console.log("Observer Added Successfully");
}
public removeObserver(observer: Observer): void {
const observerIndex = this.observers.indexOf(observer);
if (observerIndex === -1) {
return console.log("Observer Does not Exist");
}
this.observers.splice(observerIndex, 1);
console.log("Observer was successfully removed");
}
public notifyObservers(): void {
this.observers.forEach((observer) => observer.update(this));
}
public getState(): number {
return this.state;
}
public setState(state: number): void {
this.state = state;
console.log("Setting State ....");
this.notifyObservers();
}
}
// client code
const subject = new ConcreteSubject();
const observer1 = new ConcreteObserever(1);
subject.addObserver(observer1);
const observer2 = new ConcreteObserever(2);
subject.addObserver(observer2);
subject.setState(123);
728x90
반응형
'개발공부 일지 > 면접' 카테고리의 다른 글
프론트 엔드 면접 예상문제(찐) (0) | 2023.10.12 |
---|---|
Template Method(템플릿 메서드) 패턴 (0) | 2023.10.09 |
Command(커맨드) 패턴 (0) | 2023.10.08 |
Iterator(이터레이터) 디자인 패턴 (0) | 2023.10.08 |
MVC vs MVP vs MVVM (0) | 2023.10.04 |
댓글