'관찰자'
관찰하는 객체를 'Observer' 인터페이스를 구현하도록 하고,
관찰하려는 객체는 'Observable'을 상속한다.
다음예제는 난수를 만들고 이를 'Observer'가 관찰하고, 그 수를 출력하도록 한다.
package observer;
public interface Observer {
public void update(NumberGenerator generator);
}
package observer;
import java.util.ArrayList;
import java.util.Iterator;
public abstract class NumberGenerator {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
Iterator<Observer> obsItr = observers.iterator();
while(obsItr.hasNext()) {
Observer o = obsItr.next();
o.update(this);
}
}
public abstract int getNumber();
public abstract void execute();
}
package observer;
import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int number;
@Override
public int getNumber() {
return number;
}
@Override
public void execute() {
for (int i = 0; i < 20; i++) {
number = random.nextInt(50);
notifyObservers();
}
}
}
package observer;
/**
* 관찰한 수를 '숫자'로 표시하기 위함.
* @author dev-jones
*
*/
public class DigitObserver implements Observer {
@Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver : " + generator.getNumber());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package observer;
public class GraphObserver implements Observer {
@Override
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(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package observer;
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();
}
}
실행결과:
DigitObserver : 37
GraphObserver :*************************************
DigitObserver : 32
GraphObserver :********************************
DigitObserver : 27
GraphObserver :***************************
DigitObserver : 12
GraphObserver :************
DigitObserver : 20
GraphObserver :********************
DigitObserver : 25
GraphObserver :*************************
DigitObserver : 46
GraphObserver :**********************************************
DigitObserver : 30
GraphObserver :******************************
DigitObserver : 15
GraphObserver :***************
DigitObserver : 44
GraphObserver :********************************************
DigitObserver : 32
GraphObserver :********************************
DigitObserver : 30
GraphObserver :******************************
DigitObserver : 16
GraphObserver :****************
DigitObserver : 20
GraphObserver :********************
DigitObserver : 24
GraphObserver :************************
DigitObserver : 12
GraphObserver :************
DigitObserver : 45
GraphObserver :*********************************************
DigitObserver : 0
GraphObserver :
DigitObserver : 3
GraphObserver :***
DigitObserver : 6
GraphObserver :******
'자바' 카테고리의 다른 글
[자바] bridge 패턴 (0) | 2021.06.07 |
---|---|
[자바] composite 패턴 (0) | 2021.06.06 |
[자바] 싱글톤이 보장받지 않는 상황 (0) | 2021.06.03 |
[자바] builder 패턴 (0) | 2021.06.03 |
[자바] 장식자 패턴 (0) | 2021.06.03 |