16. 관찰자 모드(ObserverPattern)

4263 단어 관찰자 모드
1. 정의
대상 간의 일대다 의존 관계를 정의하여 한 대상이 상태를 바꿀 때마다 모든 의존 대상이 알림을 받고 관찰자 모드를 자동으로 업데이트하는 것을 게시 구독 모드라고 한다
 
2. 관찰자 모드의 사용 장면
  • 관련 행위 장면.주의해야 할 것은 관련 행위는'조합'관계가 아니라 분리할 수 있다는 것이다.관찰자의 생명주기는 피관찰자가 관리하지 않는다는 것이다.
  • 사건 다단계 촉발 장면.
  • 크로스 시스템의 메시지 교환 장면, 예를 들어 메시지 대기열의 처리 메커니즘.

  • 모두가 무간도를 보았다고 믿는다면 내 아래의 추상적인 토비들이 경찰서 안에 비밀을 삽입한 코드가 낯설지 않을 것이다. 이것은 관찰자 모델을 매우 형상적으로 묘사한 것이다.
     
    package _16ObserverPattern;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *  
     */
    public abstract class Observable {
    
    	//  
    	private List<Observer> observers = new ArrayList<Observer>();
    	
    	//  
    	public void addObserver(Observer observer) {
    		this.observers.add(observer);
    	}
    	
    	//  
    	public void deleteObserver(Observer observer)
    	{
    		this.observers.remove(observer);
    	}
    	
    	//  
    	public void notifyObserver(String context) {
    		for(Observer observer : observers)
    		{
    			observer.update(context);
    		}
    	}
    }
    
     
    package _16ObserverPattern;
    
    /**
     *  
     */
    public abstract class Observer {
    
    	public abstract void update(String context);
    }
    
     
    package _16ObserverPattern;
    
    /**
     *  
     */
    public class Police extends Observable {
    
    	public void action()
    	{
    		System.out.println(" ");
    		//  , 
    		notifyObserver(" , ");
    	}
    }
    
     
    package _16ObserverPattern;
    
    /**
     *  
     */
    public class Bandit extends Observer {
    
    	@Override
    	public void update(String context) {
    		System.out.println(" :"+context+"。 ");
    
    	}
    
    }
    
     
    package _16ObserverPattern;
    
    /**
     *  
     */
    public class Test {
    
    	public static void main(String[] args)
    	{
    		//  
    		Police police = new Police();
    		//  
    		Bandit bandit = new Bandit();
    		police.addObserver(bandit);
    		//  
    		police.action();
    		//  , , 
    	}
    }
    

     
    네가 아래를 집행하면 경찰이 출동하자마자 토비들이 모두 도망갔다는 것을 발견할 수 있을 것이다.이게 관찰자 모드야, 간단하지.
    사실 자바에는 이미 관찰자와 피관찰자의 추상적인 실현이 있는데 각각 자바이다.util.Observer 인터페이스와java.util.Observable 추상 클래스는 위의 실현을 대체할 수 있습니다.
     
    3. 관찰자 모드의 네 가지 역할
  • Subject 피관찰자: 피관찰자가 반드시 실현해야 할 직책을 정의하고 관찰자를 동태적으로 증가하거나 취소할 수 있어야 한다.그것은 일반적으로 추상류 또는 실현류로 피관찰자로서 반드시 실현해야 할 직책인 관찰자를 관리하고 관찰자에게 통지한다.
  • Observer 관찰자: 관찰자가 메시지를 받은 후 업데이트 작업을 하여 받은 정보를 처리한다.
  • ConcreteSubject의 구체적인 피관찰자: 피관찰자의 자신의 업무 논리를 정의하고 어떤 이벤트에 대해 알림을 하는지 정의한다.
  • ConcreteObserver의 구체적인 관찰자: 모든 관찰자는 정보를 받은 후의 처리 반응이 다르고 각 관찰자는 자신의 처리 논리를 가진다.

  • 4. 관찰자 모델의 장점
  • 관찰자와 피관찰자는 직접적으로 추상적인 결합이다. 이렇게 설계하면 관찰자를 늘리든 피관찰자를 늘리든 확장하기 쉽다. 그리고 자바에서 추상적인 등급의 정의를 실현했고 시스템 확장에 있어 더욱 순조롭다.
  • 트리거 메커니즘을 구축한다. 관찰자 모델은 하나의 트리거 체인을 완벽하게 실현할 수 있다.A는 B를 촉발하고 B는 C를 촉발한다. 이곳의 B는 바로 관찰자(A를 관찰), 또 피관찰자(C가 관찰한다).

  • 5. 관찰자 모드의 단점
    관찰자 모델은 개발 효율과 운영 효율에 대한 문제를 고려해야 한다. 피관찰자, 여러 관찰자는 개발과 디버깅이 비교적 복잡하고 자바에서 메시지 알림은 기본적으로 순서대로 실행되며 한 관찰자가 케이스를 닫으면 전체적인 실행 효율에 영향을 줄 수 있다.이런 상황에서 일반적으로 비동기(다선정)로 실현하는 것을 고려한다.다단계 촉발의 효율도 비교적 낮기 때문에 설계할 때 주의해야 한다.
     
    6. 관찰자 모드의 주의사항
  • 방송 체인 문제: 만약에 데이터베이스에 트리거를 한 적이 있다면 트리거 체인에 문제가 있다는 것을 알아야 한다. 예를 들어 표 A에 트리거가 적혀 있다. 내용은 한 필드가 갱신된 후에 표 B의 데이터를 업데이트하는 것이고 표 B에도 트리거가 있다. 더 새로운 표 C를 만들어야 한다. 이렇게 트리거를 하면 끝장이다. 이 데이터베이스는 망가진다!우리의 관찰자 모델도 같은 문제이다. 한 관찰자는 이중 신분을 가질 수 있다. 즉, 관찰자이자 피관찰자이다. 체인이 일단 구축되면 이 논리는 매우 복잡하고 유지보수성이 매우 떨어진다.경험에 따르면 하나의 관찰 모델에서 가장 많은 이중 신분의 관찰자가 나타난다. 즉, 소식을 최대 두 번(전송 한 번)까지 전달하는 것도 비교적 통제하기 쉽다.
  • 비동기 처리 문제: 관찰자가 비교적 비동기 처리를 많이 사용한다면 라인 안전과 대기열 문제를 고려해야 한다.

  • 그것과 책임 체인 모델의 가장 큰 차이점은 관찰자 방송 체인이 전파 과정에서 소식은 수시로 바뀌고 서로 인접한 두 노드가 협상하는 소식 구조이다.한편, 책임 체인 모델은 소식의 전달 과정에서 기본적으로 소식이 변할 수 없는 것을 유지하고 바꾸려면 기존의 소식만 수정할 뿐이다.
     
    7. 현실 세계의 관찰자 모델
  • PC 파일 시스템: 파일을 추가하면 디렉터리 관리자에게 이 디렉터리를 추가하고 디스크 관리자에게 공간을 줄이라고 알려야 한다.
  • 라디오: 라디오는 피관찰자, 라디오는 관찰자.
  • 좋은 웹페이지 즐겨찾기