BACK_END

Observer

서울소시민 2018. 5. 9. 17:50

Observer 패턴

"관찰 대상의 상태가 변화하면 관찰자에게 알려준다."

NumberGenerator는 Observer를 저장하는 arrayList를 갖는다. 그리고 추가, 저장, notifyObserver()메소드를 가지고있다. 또 추상클래스인데, getNumber(), execute() 메소드를 추상메소드로 갖는다.

NumverGenerator 클래스를 상속 받아 RandomGenerator 클래스가 나온다. 이 클래스는 execute, getNumber 메소드를 구현한다. execute() 메소드는 Random 수를 this.number 필드에 저장하고, NumberGenerator의 notifyObserver() 메소드를 호출한다.

notityObserver() 메소드는 NumberGenerator의 arrayList에 저장된 observer의 update()메소드를 호출한다. observer는 인터페이스로 구성되어 있는데, 이 인터페이스를 digitObserver, graphObserver가 implements하여 구현한다. 각 클래스에 맞는 출력물을 출력한다.

UML은 다음과 같다.


다음은 Main의 코드이다.


public class Main {
   public static void main(String[] args) {
       NumberGenerator generator = new RandomNumberGenerator();
       // 이걸 뭐라고 하지?? java에서 가르키는 용어는?
       Observer observer1 = new DigitObserver();
       Observer observer2 = new GraphObserver();
       generator.addObserver(observer1);
       generator.addObserver(observer2);
       generator.execute();
  }
}

  1. Main class에서 NumberGenerator, Observer1,2 인스턴스를 생성하고, addObserver 메소드로 Observer를 generator인스턴스가 가지고 있는 ArrayList에 추가 해줍니다.

  2. 그리고 다시 Main class로 돌아와 generator.execute() 메소드를 호출하여 줍니다.

  3. generator.execute() 메소드는 NumberGenerator 클래스에 추상 메소드로 정의 되어있습니다. 그래서 NumberGenerator class를 상속 받는 RamdomNumberGenerator class에서 구현합니다.

  4. RamdomNumberGenerator class 에서는 랜덤으로 숫자를 생성하고, notifyObservers()메소드를 호출합니다.

  5. notifyObservers()는 NumberGenerator class에 구현되어 있습니다. 이 메소드 안에는 update() 메소드가 있는데, 이는 Observer라는 인터페이스에 정의되어 있는 메소드이고, 구현은 DigitObserver, GraphObserver에 되어 있습니다.

  6. DigitObserver,GraphObserver의 update 메소드는 각 class에 맞게 실행됩니다.


'BACK_END' 카테고리의 다른 글

Observer 패턴  (0) 2018.04.25
State 패턴  (0) 2018.04.25
ec2-linux MariaDB 설치/제거 하기  (0) 2017.08.31