Chapter 17 Observer 상태의 변화를 알려주기 - brodieroy/Study GitHub Wiki

1. 무작정 소스를 다운받아서 봅시다. A2, Q2, Sample1, Sample2 가 있더군요.

2. Sample1을 봅시다.

###참고

In the first of two experiments, "distance" between experimenter and subject

실험자 , 피실험자

####교환가능성의 등장 정리

추상클래스나 인터페이스를 사용해서 구상클래스로부터 추상 메소드를 분리한다.
인수로 인스턴스를 전달할 때, 필드에서 인스턴스를 저장할 때에는 구상클래스의 형태로 하지 않고 추상 클래스나 인터페이스의 형태로 해 둔다.

obsrver은 관찰자 이지만 " 전달" 되는것을 수동적으로 기다리고 있습니다. Publish-Subscribe 패턴이라고도 합니다.

MVC에서 하나의 Model에 복수의 View가 대응하고있습니다.

Observer.java

public interface Observer {
    public abstract void update(NumberGenerator generator);
}

GraphObserver.java

ublic class GraphObserver implements Observer {
    public void update(NumberGenerator generator) {
        System.out.print("GraphObserver:");
        int count = generator.getNumber();
        for (int i = 0; i < count; i++) {
            System.out.print("*");
        }
        System.out.println("");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
    }
}

DigitObserver.java

public class DigitObserver implements Observer {
    public void update(NumberGenerator generator) {
        System.out.println("DigitObserver:" + generator.getNumber());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
    }
}

NumberGenerator.java

import java.util.ArrayList;
import java.util.Iterator;

public abstract class NumberGenerator {
    private ArrayList observers = new ArrayList();        // Observer를 저장
    public void addObserver(Observer observer) {    // Observer를 추가
        observers.add(observer);
    }
    public void deleteObserver(Observer observer) { // Observer를 삭제
        observers.remove(observer);
    }
    public void notifyObservers() {               // Observer에 알림
        Iterator it = observers.iterator();
        while (it.hasNext()) {
            Observer o = (Observer)it.next();
            o.update(this);
        }
    }
    public abstract int getNumber();                // 수를 취득한다.
    public abstract void execute();                 // 수를 생성한다.
}

RandomNumberGenerator.java

public class RandomNumberGenerator extends NumberGenerator {
    private Random random = new Random();   // 난수발생기
    private int number;                     // 현재의 수
    public int getNumber() {                // 수를 취득한다.
        return number;
    }
    public void execute() {
        for (int i = 0; i < 20; i++) {
            number = random.nextInt(50);
            notifyObservers();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        NumberGenerator generator = new RandomNumberGenerator();
        Observer observer1 = new DigitObserver();
        Observer observer2 = new GraphObserver();
        generator.addObserver(observer1);
        generator.addObserver(observer2);
        generator.execute();
    }
}

관찰대상의 상태가 변하면 관찰자에게 알려줍니다.