Java Design Pattern - Observer Pattern

업데이트:

Design Pattern

  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
  • 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.

Behavioral Patterns, 행위 패턴

  • 객체간의 상호작용과 책임을 중시하는 패턴이다.
  • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하면서 객체 사이의 결합도를 최소화하는 것에 중점을 두는 패턴이다.

Flyweight Pattern

  • 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴이다.

Example

public class Subject {

  private List<Observer> observers = new ArrayList<Observer>();
  private int state;

  public int getState() {
    return state;
  }

  public void setState(int state) {
    this.state = state;
    notifyAllObservers();
  }

  public void attach(Observer observer) {
    observers.add(observer);
  }

  public void notifyAllObservers() {
    for (Observer observer : observers) {
      observer.update();
    }
  }

}
  • 각 String 별 Observer Pettern을 위한 Subject 객체를 선언한다.
public abstract class Observer {

  protected Subject subject;

  public abstract void update();

}
public class BinaryObserver extends Observer {

  public BinaryObserver(Subject subject) {
    this.subject = subject;
    this.subject.attach(this);
  }

  @Override
  public void update() {
    System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
  }

}
public class HexaObserver extends Observer {

  public HexaObserver(Subject subject) {
    this.subject = subject;
    this.subject.attach(this);
  }

  @Override
  public void update() {
    System.out.println("Hex String: " + Integer.toHexString(subject.getState()).toUpperCase());
  }

}
public class OctalObserver extends Observer {

  public OctalObserver(Subject subject) {
    this.subject = subject;
    this.subject.attach(this);
  }

  @Override
  public void update() {
    System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
  }

}
  • Subject 객체를 활용하는 Observer 추상 객체를 선언하고 BinaryObserver, HexaObserver, OctalObserver를 구현한다.
public class ObserverPatternMain {

  public static void main(String[] args) {
    Subject subject = new Subject();

    new HexaObserver(subject);
    new OctalObserver(subject);
    new BinaryObserver(subject);

    System.out.println("First state change: 15");
    subject.setState(15);
    System.out.println("Second state change: 10");
    subject.setState(10);
  }

}
  • 각 BinaryObserver, HexaObserver, OctalObserver객체를 생성할 때, 공통의 Subject 객체를 주입하여 Subject 객체를 이용하여 일대 다 의존 관계를 구성하여 State를 관리한다.

Source

Sample Code는 여기에서 확인 가능합니다.

댓글남기기