💡 디자인 패턴이란?
💡 옵저버 패턴 (observer pattern)
이란?
주체
가 어떤 객체
의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
🔗 실제 사용
Vue.js 3.0
프레임워크MVC 패턴 (Model - View - Controller)
⭐️ 옵저버 패턴 활용 자바 예시 코드
👉 topic은 주체이자 객체
interface Subject{
public void register(Observer obj);
public void unregister(Observer obj);
public void notifyObservers();
public Object getUpdate(Observer obj);
}
interface Observer{
public void update();
}
class Topic implements Subject{
private List<Observer> observers;
private String message;
public Topic(){
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void register(Observer obj){
if(!observers.contains(obj))
observers.add(obj);
}
@Override
public void unregister(Observer obj){
observers.remove(obj);
}
@Override
public void notifyObservers(){
this.observers.forEach(Observer::update);
}
@Override
public Object getUpdate(Observer obj){
return this.message;
}
public void postMassage(String msg){
System.out.println("Message sended to Topic: " + msg);
this.message = msg;
notifyObservers();
}
}
class TopicSubscriber implements Observer{
private String name;
private Subject topic;
public TopicSubscriber(String name, Subject topic){
this.name = name;
this.topic = topic;
}
@Override
public void update(){
String msg = (String) topic.getUpdate(this);
System.out.println(name + ":: got message >> " + msg);
}
}
public class ObserverPattern{
public static void main(String[] args){
Topic topic = new Topic();
Observer a = new TopicSubscriber("a", topic);
Observer b = new TopicSubscriber("b", topic);
topic.register(a);
topic.register(b);
topic.postMassage("Happy new year!");
}
}
/*
Message sended to Topic: Happy new year!
a:: got message >> Happy new year!
b:: got message >> Happy new year!
*/
자바스크립트에서 옵저버 패턴 - 프록시 객체
프록시(proxy) 객체
: 어떠한 대상의 기본적인 동작의 작업을 가로챌 수 있는 객체로, 두 매개변수를 가짐
target : 프록시할 대상
handler : target 동작을 가로채고 어떠한 동작을 할 것인지의 함수
🔗 프록시 객체 활용 자바스크립트 옵저버 패턴 예시 코드
function createReactiveObject(target, callback){
const proxy = new Proxy(target, {
set(obj, prop, value){
if(value !== obj[prop]){
const prev = obj[prop]
obj[prop] = value;
callback(`${prop}가 [${prev}] >> [${value}] 로 변경되었습니다.`)
}
return true
}
})
return proxy
}
const a = {"형규" : "솔로"}
const b = createReactiveObject(a. console.log)
b.형규 = "솔로"
b.형규 = "커플"
// 형규가 [솔로] >> [커플] 로 변경되었습니다.
💡 상속(extends)
이란?
자식 클래스가 부모 클래스의 메서드 등을 상속받아 사용하며, 자식 클래스에서 추가 및 확징을 할 수 있는 것
-> 재사용성, 중복성의 최소화
일반 클래스, abstract 클래스를 기반으로 구현
💡 구현(implements)
이란?
부모 인터페이스를 자식 클래스에서 '재정의'하여 구현하는 것으로 반드시 부모 클래스의 메서드를 재정의해야 함
인터페이스(interface)를 기반으로 구현