이름 |
해설 |
Observer |
관찰자를 나타내는 인터페이스 |
NumberGenerator |
수를 생성하는 오브젝트를 나타내는 클래스 |
RandomNumberGenerator |
랜덤으로 수를 생성하는 클래스 |
DigitObserver |
숫자로 수를 표시하는 클래스 |
GraphObserver |
간이 그래프로 수를 표시하는 클래스 |
Main |
동작 테스트용 클래스 |
Observer 인터페이스
package kch;
public interface Observer {
public abstract void update(NumberGenerator generator);
}
NumberGenerator 클래스
package kch;
import java.util.ArrayList;
import java.util.Iterator;
public abstract class NumberGenerator {
/**
* @uml.property name="observers"
* @uml.associationEnd multiplicity="(0 -1)" elementType="kch.Observer"
*/
private ArrayList observers = new ArrayList();
public void addObserver(Observer observer){
observers.add(observer);//옵저버 추가
}
public void deleteObserver(Observer observer){
observers.remove(observer);//옵저버 삭제
}
public void notifyObservers(){
Iterator it = observers.iterator();
//각 옵저버에게 update하라고 알림.
while(it.hasNext()){
Observer o = (Observer)it.next();//참조변수가 Observer 타입이 됨.
o.update(this);//알리는 부분
}
}
public abstract int getNumber();//숫자를 가져옴
public abstract void execute();//숫자를 발생시키는 부분
}
RandomNumberGenerator 클래스
package kch;
import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator{
/**
* @uml.property name="random"
*/
private Random random = new Random();
/**
* @uml.property name="number"
*/
private int number;
/**
* @return
* @uml.property name="number"
*/
public int getNumber(){
return number;
}
public void execute(){
for(int i = 0; i < 20; i++){
number = random.nextInt(50);//(0~49숫자 발생)
notifyObservers();//옵저버에게 말림.
}
}
}
DigitObserver 클래스
package kch;
public class DigitObserver implements Observer{
public void update(NumberGenerator generator){
System.out.println("DigitObserver : " + generator.getNumber());//실제 인스턴스는
//RandomNumberGenerator이다.
try{
Thread.sleep(100);
}catch(InterruptedException e){
}
}
}
GraphObserver 클래스
package kch;
public class GraphObserver implements Observer{
@Override
public void update(NumberGenerator generator) {
// TODO Auto-generated method stub
System.out.print("GraphObserver");
int count = generator.getNumber();
//인스턴스는 RandomNumberGenerator이다.
for(int i = 0; i < count; i++){
System.out.print("*");//count만큼 * 발생시킴.
}
System.out.println("");
try{
Thread.sleep(100);
}catch(InterruptedException e){
}
}
}
Main 클래스
package kch;
public class Main {
public static void main(String[] args){
NumberGenerator generator = new RandomNumberGenerator();
//인스턴스는 RandomNumberGenerator이다.
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.execute();
}
}
결과화면
옵저버 패턴은 관찰자와 관찰대상이 있는데 관찰 대상이 내가 바뀌었다고 말을 해주면 관찰자는 그에따라서 행동을 하게 됩니다.
여기서는 랜덤변수를 만드는 행동이 관찰대상이 바뀌었다고 말을 해서 update메소드를 호출하면 관찰자들은 그에따른 역할을 하게 됩니다.
Mediator 패턴은 Colleague들이 내가 뭔가 바뀌었다고 중재자에게 말을 해서 중재자는 그에따라서 너는 뭐하고 너는 뭐하라고 역할의 조정을 하는 반면
Observer 패턴은 관찰대상이 바뀌면 그에 따라서 관찰자들이 각자 행동을하는 동기화라는 점에 중점을 두었습니다.
http://blog.naver.com/towozy?Redirect=Log&logNo=90128028664
사이트에 적절한 비유가 있으니 꼭보세요.
'프로그래밍 > 자바 디자인패턴' 카테고리의 다른 글
디자인패턴 Proxy 패턴 (0) | 2012.08.16 |
---|---|
디자인패턴 Flyweight 패턴 (0) | 2012.08.15 |
디자인패턴 State 패턴 (0) | 2012.08.14 |
디자인 패턴 Memento 패턴 (0) | 2012.08.13 |
디자인패턴 Mediator 패턴 (0) | 2012.08.09 |
디자인패턴 Facade 패턴 (0) | 2012.08.06 |
디자인 패턴 ProtoType패턴 (0) | 2012.08.03 |
디자인 패턴 singleton 패턴 (0) | 2012.08.03 |