자바 관찰자 모드(Observer)상세 해석 및 응용---모드 중의 황후

8155 단어 디자인 모드
       

개술
자바 의 디자인 모델 이 매우 많 고 관찰자 모델 은 모델 중의 황후 라 고 불 리 며 자바 jdk 도 이 를 실현 한 것 을 보면 이 디자인 모델 의 중요 한 위 치 를 알 수 있다.그래 픽 디자인 소프트웨어 에서 보기 와 이벤트 처리 의 분 리 를 실현 하기 위해 대부분 Observer 모드 를 사용 했다.예 를 들 어 자바 의 Swing,Flex 의 ActionScript 등 이다.현실 적 인 응용 시스템 에서 도 많은 응용 프로그램 이 있다.예 를 들 어 당 당 망,경 동상 점 과 같은 전자상거래 사 이 트 는 만약 에 특정한 상품 에 관심 이 많 으 면 소장 대 에 넣 을 수 있다.그러면 이 상품 이 가격 을 내 릴 때 시스템 은 핸드폰 문자 나 메 일 을 보 낼 수 있다.이것 이 바로 관찰자 모델 의 전형 적 인 응용 이다.상품 은 피 관찰자 이 고 어떤 것 은 주체 라 고 부른다.이 상품 을 주목 하 는 고객 은 관찰자 다.다음 사례 는 이 응용 을 모 의 할 것 이다.
 
GoF 는 Observer 모드 의 의 도 는"대상 간 의 다 중 의존 관 계 를 정의 하 는 것"이 라 며"대상 의 상태 가 바 뀌 면 그 에 의존 하 는 모든 대상 이 알림 을 받 고 자동 으로 업데이트 된다"고 말 했다.이 말 에서 우 리 는 두 가지 정 보 를 얻 을 수 있다.다음 과 같다.
 
1.관찰자(구체 적 으로 조작 을 수행 하 는 대상 은 여러 개)
2.피 관찰자(말 그대로 관찰 대상 이 고 해당 대상 에 게 어떤 변화 가 발생 하면 관찰자 에 게 해당 하 는 체 조 를 집행 하도록 통지)
 
2.jdk 에서 관찰자 모드 분석
 
자바 의 util 패키지 에서 이 디자인 모델 의 구 조 를 실현 했다.대부분의 응용 은 그것 을 직접 사용 할 수 있다.물론 너 도 스스로 그것 을 실현 할 수 있다.사실은 피 관찰자 의 추상 류 와 관찰자 인터페이스 이다.jdk 가 어떻게 실현 되 었 는 지 먼저 봅 시다.피 관찰자 의 추상 류 java.util.Observable
 
packagejava.util;
publicclass Observable {
    private boolean changed = false;
    private Vector obs;
  
  //피 관찰 자 를 만 들 때 가지 고 있 는 관찰자 목록 을 만 듭 니 다.이 목록 은 동기 화 되 어야 합 니 다.
    public Observable() {
         obs = new Vector();
    }
 
     /** 
     * 관찰자 목록 에 관찰 자 를 추가 합 니 다. 
     */ 
    public synchronized voidaddObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
         if (!obs.contains(o)) {
            obs.addElement(o);
         }
    }
 
     /** 
     * 관찰 자 삭제 
     */  
    public synchronized voiddeleteObserver(Observer o) {
        obs.removeElement(o);
    }
 
 
    public void notifyObservers() {
         notifyObservers(null);
    }
     /** 
     * 알림 조작,즉 피 관찰자 에 게 변화 가 발생 하여 해당 하 는 관찰자 에 게 사전에 설정 한 조작 을 하도록 통지 합 니 다.이 방법 은 하나의 파 라 메 터 를 받 아들 이 고 이 파 라 메 터 는 관찰자 에 게 전달 되 어 관찰자 가 사용 할 수 있 도록 합 니 다.
     */  
    public void notifyObservers(Object arg) {
 
        Object[] arrLocal;
 
         synchronized (this) {
 
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }
 
        for (int i = arrLocal.length-1;i>=0; i--)
           ((Observer)arrLocal[i]).update(this, arg);
    }
 
 
    public synchronized void deleteObservers(){
         obs.removeAllElements();
    }
 
    protected synchronized void setChanged() {
         changed = true;
    }
 
    protected synchronized void clearChanged(){
         changed = false;
    }
 
 
    public synchronized boolean hasChanged() {
         return changed;
    }
 
    public synchronized int countObservers() {
         return obs.size();
    }
}
 
 
우리 자신의 피 관찰자 가 이 Observable 류 를 계승 하면 우 리 는 피 관찰자 의 모든 조건 을 자동 으로 얻 을 수 있다.편리 하 죠?이것 도 왜 sun 이 Observable 을 자바 util 가방 에 넣 어야 하 는 이유 입 니 다.바로 개발 자 들 의 편 의 를 위해 서 입 니 다.
 
다음은 관찰자 의 인터페이스 자바 util.Observer 를 살 펴 보 겠 습 니 다.
 
packagejava.util;
 
publicinterface Observer {
 
    void update(Observable o, Object arg);
}
인터페이스 에는 한 가지 방법 만 있 습 니 다.update,방법 에는 두 개의 매개 변수 가 있 습 니 다.Observable 과 하나의 object 가 있 습 니 다.첫 번 째 매개 변 수 는 관찰 대상 이 고 두 번 째 매개 변 수 는 업무 수요 에 따라 필요 한 것 을 전달 해 야 합 니 다.우리 자신의 관찰자 류 는 반드시 이 방법 을 실현 해 야 한다.그러면 피 관찰자 가 notify Observer 를 호출 할 때 피 관찰자 가 가지 고 있 는 모든 관찰자 가 update 작업 을 수행 할 것 이다.
 
3.관찰자 모델 응용
 
다음은 북 대상 입 니 다.피 관찰자 이기 때문에 Observable 을 계승 해 야 합 니 다.
import java.util.Observable;
public class Book extends Observable {
 
    private String name = "";
    private double price = 0.0;
    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
 
    public double getPrice() {
       return price;
    }
    public void setPrice(double price) {
       this.price = price;
    }
    //책의 가격 을 수정 할 때 이 방법 을 사용한다.
    public void modifyPrice(Book b) {
       //부류 의 방법 을 호출 하여 피 관찰자 의 상 태 를 바꾸다. 
       setChanged();
       //고객 에 게 이 책 이 이미 가격 이 내 렸 다 고 통지 하 다.
       notifyObservers(b);
    }
 
}
 
다음은 관찰자 대상 으로 고객 의 이메일 을 표시 하 며 Observer 인 터 페 이 스 를 실현 했다.
importjava.util.Observable;
importjava.util.Observer;
publicclass BuyerEmail implements Observer {
 
         private String buyerId = "";
         private String email = "";
 
         public String getBuyerId() {
                   return buyerId;
         }
         public void setBuyerId(String buyerId){
                   this.buyerId = buyerId;
         }
         public String getEmail() {
                   return email;
         }
         public void setEmail(String email) {
                   this.email = email;
         }
//이 방법 은'피 관찰자 의 부류'기 존 Observable 에 의 해 호출 됩 니 다.
         public void update(Observable o, Objectarg) {
                   //여기 서 이메일 을 구체 적 으로 보 내 는 작업 을 합 니 다.
                    Book b = (Book)arg;
                   System.out.println("고객 에 게 보 내 는 이메일:"+b.getName()+"가격 이 내 렸 습 니 다.현재 가격 은:"+b.getPrice()입 니 다.
         }
}
 
다음은 또 다른 관찰자 대상 으로 고객 의 휴대 전화 역시 Observer 인 터 페 이 스 를 계승 해 야 한 다 는 뜻 이다.
importjava.util.Observable;
importjava.util.Observer;
publicclass BuyerMobileMessage implements Observer {
 
         private String buyerId = "";
         private String mobileNo = "";
 
         public String getBuyerId() {
                   return buyerId;
         }
         public void setBuyerId(String buyerId){
                   this.buyerId = buyerId;
         }
         public String getMobileNo() {
                   return mobileNo;
         }
         public void setMobileNo(StringmobileNo) {
                   this.mobileNo = mobileNo;
         }
         public void update(Observable o, Objectarg) {
                   // TODO Auto-generated methodstub
                   Book b = (Book)arg;
                   System.out.println("고객 에 게 보 내 는 핸드폰 문자:"+b.getName()+"가격 이 내 렸 습 니 다.현재 가격 은:"+b.getPrice()입 니 다.
         }
}
 
다음은 호출 클래스:
 
public class MainApp {
 
    public static void main(String args[])
    {
       Book b1 = new Book();
       b1.setName("<디자인 모드>>");
       b1.setPrice(45.00);//원가 가 60 이 라 고 가정 하면 지금 은 가격 을 내 려 판 촉 한다.
      
       //아래 관찰 자 는 실제 응용 에서 데이터베이스 나 파일 에서 읽 을 수 있 습 니 다.
       BuyerMobileMessage bm = new BuyerMobileMessage();
       bm.setBuyerId("001");
       bm.setMobileNo("13810500085");
      
       BuyerEmail be = new BuyerEmail();
       be.setBuyerId("001");
       be.setEmail("[email protected]");
      
       //관찰 자 를 늘 리 는 것 은 실제 응용 에서 그 사람들 이 이 책 에 관심 을 가 졌 다 는 것 이다.
       b1.addObserver(bm);
       b1.addObserver(be);
      
       b1.modifyPrice(b1);
    }
}
 
출력:
고객 에 게 보 내 는 이메일:<>가격 이 내 렸 습 니 다.현재 가격 은 45.0 입 니 다.
고객 에 게 보 내 는 핸드폰 문자:<>가격 이 내 렸 습 니 다.현재 가격 은 45.0 입 니 다.
 
위의 예 를 알 아 보 셨 는 지 모 르 겠 습 니 다.관찰자 모델 은 실제 적 으로 깊 은 것 이 없습니다.바로 자바 의 계승 과 인 터 페 이 스 를 활용 하여 피 관찰자 의 추상 류 에 상태 표 지 를 설정 하고 이 표 지 를 통 해 관찰자 대상 에 게 알 리 는 지 여 부 를 판단 합 니 다.이 모델 을 배 우 는 동시에 우 리 는 자바 의 계승 과 인터페이스의 유연 한 응용 을 배 워 야 한다.사실은 모든 디자인 모델 은 계승,인터페이스,다 중 적 인 유연 한 응용 이다.

좋은 웹페이지 즐겨찾기