Observer-관찰자 모드

4506 단어
정의
관찰자 모델은 GOF에서 이렇게 정의된다. 정의 대상 간의 일대다 의존 관계는 한 대상의 상태가 바뀔 때 그에 의존하는 모든 대상이 알림을 받고 자동으로 업데이트된다.이러한 객체 간의 상호 작용을 게시 - 가입이라고도 합니다.
2. 장면 디자인
이러한 응용 장면을 고려한다. 한 그룹의 데이터가 실시간으로 동태적으로 변화하기 때문에 지금은 이 그룹의 데이터를 시각적으로 표시해야 한다.주상도, 표, 떡상도 등데이터의 변화는 시각화된 표시에 제때에 반영해야 한다.이것이 바로 전형적인 게시 - 구독 장면으로 각종 시각화 형식은 데이터의 상태를 관찰해야 한다.일단 데이터에 변화가 발생하면 변화는 각 관찰하고 있는 가시화 표현 형식에 전달해야 한다.
또한 가시화 표현 형식이 여러 개일 수 있음을 주의해야 하며 데이터는 어떤 관찰자가 관찰하고 있는지에 대해 어떠한 가설도 해서는 안 된다.여기서 유지보수 데이터의 클래스를 ConcreteSubject라고 하고 관찰자의 시각화 형식의 클래스를 ConcreteObserver라고 하는데 ConcreteObserver는 여러 종류가 있을 수 있습니다.대상을 대상으로 하는 디자인 원칙을 바탕으로 고려한다. 변화하는 것과 변하지 않는 것을 분리한다.Update () 허위 방법을 유지하는 Observer 클래스를 추상화할 수 있습니다. 이 예에서 이 방법은 각각의 시각적 형식의 업데이트 방식을 대표합니다.이 추상을 통해 피관찰자(데이터)에게 관찰자의 구체적인 정보를 차단할 수 있다.
이렇게 추상적인 후에 Concrete Subject 클래스에서 Observer 클래스의 체인 테이블을 유지할 수 있다. Concrete Observer가 데이터를 관찰하기 시작할 때 먼저 이 체인 테이블에 등록해야 한다.이렇게 하면 ConcreteSubject 상태가 변경되면 이 체인 테이블을 옮겨다니며 등록된 모든 관찰자에게 해당하는 변화를 발표할 수 있다.
이로써 게시 - 구독 기능은 이미 실현되었다.그러나 피관찰자가 여러 개, 즉 ConcreteSubject에 여러 종류가 있다면 이 디자인은 융통성이 없어 보인다.ConcreteSubject를 추상화할 수 있습니다.Subject 클래스를 추상화합니다. 이 클래스는 Observer 클래스 체인 테이블에서 요소의 증가, 삭제, 상태 변화 후의 스트리밍을 유지합니다.피관찰자의 상태변경 방법Set()과 상태획득 방법Get()은 자연히 구체적인 유형인 ConcreteSubject가 각각 유지한다.이 경우, 관찰자가 알림이 어떤 관찰자가 보냈는지 알 수 있도록 Observer 클래스의 Update 인터페이스를 확장해야 한다.피관찰자는 자신을 업데이트 작업의 매개 변수로 간단하게 삼아 관찰자에게 어떤 목표를 검사해야 하는지 알 수 있다.
3. 코드 실현
Observer 인터페이스:
4
public interface Observer {
	
	  void update(String state);
	  void update(Subject subject);
}
Subject의 변화 속성을 매개 변수로 하는 두 개의 업데이트 함수를 다시 불러왔습니다.
협의를 추진하다.다른 하나는 Subject 자체를 매개 변수로 하여
협의를 맺다.
Subject 가상 클래스:
import java.util.*;
public abstract class Subject {
	private List<Observer> list=new ArrayList<Observer>();
	
	public void attach(Observer ob)
	{
		list.add(ob);
		System.out.println("Attach an observer");
	}
	
	public void detach(Observer ob)
	{
		list.remove(ob);
		System.out.println("Remove an observer");
	}
	
	public void notifyObservers(String newstate)
	{
		 for(Observer temp:list)
		 {
			 temp.update(newstate);
		 }
	}
	
	public void notifyObservers()
	{
		for(Observer temp:list)
			temp.update(this);
	}
}
마찬가지로 notify Observers도 두 개를 다시 불러왔습니다. 하나는 new state를 매개 변수로 합니다.다른 파라미터는 없지만 observer의 업데이트를 호출할 때 자신을 전달하고 Observer에서 변화에 응답할지 여부를 결정합니다.
ConcreteObserver 클래스:
public class ConcreteObserver implements Observer{
	
	private String observerState;
	private int observerInt;
	public void update(String newstate)
	{
		observerState=newstate;
		System.out.println(" , :"+observerState);
	}
	
	public void update(Subject subject)
	{
		observerInt=((ConcreteSubject)subject).getNum();
		System.out.println(" , :"+observerInt);
	}

}
Subject 객체를 매개 변수로 하는 업데이트 방법에 주의하십시오.여기에는 하향 조형이 사용되어 실제 전달된 ConcreteSubject의 대상을 얻어 어떤 변화의 값에 대한 처리를 결정할 수 있다.이것이 바로
협정을 맺다
관건이 되는 곳.
ConcreteSubject 클래스:
public class ConcreteSubject extends Subject{
	
	private String state;
	private int num;
	public String getState()
	{
		return this.state;
	}
	public int getNum()
	{
		return this.num;
	}
	public void change(String newstate)
	{
		state=newstate;
		
		System.out.println(" :"+state);
		
		this.notifyObservers(newstate);
	}
	
	public void change(String newstate,int num)
	{
		this.state=newstate;
		this.num=num;
		System.out.println(" :"+this.state+" "+this.num);
		this.notifyObservers();
	}
}
change (String, int) 는 state와num 두 개의 값을 바꾸지만, 파라미터가 없는 notify Observers () 를 호출했습니다. 이것은 Observer에num의 변경 사항만 보일 수 있음을 알립니다.
Client 클래스:
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ConcreteSubject subject=new ConcreteSubject();
		
		Observer observer1=new ConcreteObserver();
		
		subject.attach(observer1);
		
		subject.change("I hate You",2);
		
		System.out.println("-----------------");
		
		Observer observer2=new ConcreteObserver();
		
		subject.attach(observer2);
		
		subject.change("I Love you");
	}

}
실행 결과:
Attach an observer
상태 변경: I hate You 2
상태 변화, 당기기:2
-----------------
Attach an observer
상태 변경: I Love you
상태 변경, 푸시: I Love you
상태 변경, 푸시: I Love you
마지막으로 자바는 관찰자 모드에 대한 지원을 제공합니다: 자바.util.Observer와java.util.Observable, 잘 연구해 볼 수 있어요.

좋은 웹페이지 즐겨찾기