노현진's Blog

Observer pattern

Observer pattern에 대해 설명하는 페이지입니다.

Posted
Preview Image
By HyunJinNo

Tags

Design Pattern, Java

1. Introduction

  • a.k.a
    • Publish/Subscibe model
  • Purpose
    • Lets one or more objects be notified of state changes in other objects within the system
  • Use When
    • Loose coupling is needed for communications
    • State changes in one or more objects should trigger behavior in other objects
    • Broadcasting capabilities are required.
    • An understanding exists that objects will be blind to the expense of notification
  • Definition
    • It defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.

2. How to Use

  • Observable (Publisher) side

    • To send notifications
      • Call SetChanged()
      • Call either notifyObservers() or notifyObservers(Object arg)
    java
    1import java.util.Observable;
    2import java.util.Observer;
    3
    4public class MyData extends Observable {
    5    private int number;
    6
    7    public MyData() {}
    8
    9    public void measurementsChanged() {
    10        setChanged();
    11        notifyObservers();
    12    }
    13
    14    public void setMeasurements(int number) {
    15        this.number = number;
    16        measurementsChanged();
    17    }
    18
    19    public int getNumber() {
    20        return number;
    21    }
    22}
  • Observer (Subsciber) side

    • To become an observer
      • Implement java.util.Observer interface
    • To subscribe
      • Call addObserver() on any Observable object
    • To unsubscribe
      • Call deleteObserver()
    • To get updated
      • Implement update(Observable o, Object arg)
    java
    1import java.util.Observable;
    2import java.util.Observer;
    3
    4public class MyObserver implements Observer {
    5    Observable observable;
    6    private int number;
    7
    8    public MyObserver(Observable observable) {
    9        this.observable = observable;
    10        observable.addObserver(this);
    11    }
    12
    13    public void update(Observable obs, Object arg) {
    14        if (obs instanceof MyData) {
    15            MyData myData = (MyData) obs;
    16            this.number = myData.getNumber();
    17
    18            // Something to execute
    19        }
    20    }
    21}

© HyunJinNo. Some rights reserved.