자바 관찰자 모드(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 입 니 다.
위의 예 를 알 아 보 셨 는 지 모 르 겠 습 니 다.관찰자 모델 은 실제 적 으로 깊 은 것 이 없습니다.바로 자바 의 계승 과 인 터 페 이 스 를 활용 하여 피 관찰자 의 추상 류 에 상태 표 지 를 설정 하고 이 표 지 를 통 해 관찰자 대상 에 게 알 리 는 지 여 부 를 판단 합 니 다.이 모델 을 배 우 는 동시에 우 리 는 자바 의 계승 과 인터페이스의 유연 한 응용 을 배 워 야 한다.사실은 모든 디자인 모델 은 계승,인터페이스,다 중 적 인 유연 한 응용 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.