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();
}
}
관찰대상의 상태가 변하면 관찰자에게 알려줍니다.