스파이더 웹 개발

옵저버 패턴 본문

디자인 패턴과 프로그래밍 패러다임

옵저버 패턴

스파이더웹 2022. 7. 20. 14:11
728x90
반응형
  • 옵저버 패턴은 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
  • 또한, 옵저버 패턴은 주로 이벤트 기반 시스템에 사용하며, MVC 패턴에도 사용한다
//옵저버 패턴
package book.designpattern;

import java.util.ArrayList;
import java.util.List;

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObserver();
    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 notifyObserver() {
        this.observers.forEach(Observer::update);
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    }

    public void postMessage(String msg){
        System.out.println("메시지 발송 : " + msg);
        this.message = msg;
        notifyObserver();
    }
}

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 ObserverClass {

    public static void main(String[] args) {

        Topic topic = new Topic();
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);

        topic.register(a);
        topic.register(b);
        topic.register(c);

        topic.postMessage("고루고루고루마존!");
    }
}

상속 과 구현

상속

  • 상속은 자식 클래스가 부모 클래스의 메서드 등을 상속 받아 사용하며, 자식클래스에서 추가 및 확장을 할 수 있는 것을 말합니다. 이로 인해 재사용성, 중복의 최소화가 이루어진다

구현

  • 상속과는 달리 반드시 부모클래스의 메서드를 재정의하여 구현해야 한다(강제성)
  • 구현은 부모 인터페이스를 자식 클래스에서 재정의하여 구현하는 것을 말한다.

 

상속과 구현의 차이

  • 상속은 일반 클래스, abstract 클래스(추상 클래스)를 기반으로 구현하며, 구현은 인터페이스를 기반으로 구현한다
728x90
반응형

'디자인 패턴과 프로그래밍 패러다임' 카테고리의 다른 글

MVC 패턴  (0) 2022.07.20
프록시 패턴  (0) 2022.07.20
전략 패턴  (0) 2022.07.20
팩토리 패턴  (0) 2022.07.20
싱글톤 패턴  (0) 2022.07.20
Comments