프로그래밍/자바 디자인패턴

디자인패턴 Observer 패턴

가카리 2012. 8. 10. 16:54
반응형

 

 

 

이름

해설

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

 

사이트에 적절한 비유가 있으니 꼭보세요.