안 드 로 이 드 의 디자인 모델 - 관찰자 모드

4703 단어 android
"대상 간 에 한 쌍 의 다 중 의존 을 정의 합 니 다. 그러면 한 대상 이 상 태 를 바 꾸 면 대상 이 알림 을 받 습 니 다." 장면: 한 대상 (또는 데이터) 이 업데이트 되 고 다른 유형 도 이에 따라 변화 해 야 합 니 다. 예 를 들 어 Android 에서 특정한 데이터 가 바 뀌 었 고 여러 곳 의 UI 가 동시에 변화 해 야 합 니 다.해결 방향: 1. 감청 되 는 콘 텐 츠 클래스 (Observable) 를 만 듭 니 다. 이 클래스 는 하나의 인 터 페 이 스 를 실현 합 니 다. 그 안에 세 가지 주요 방법 이 있 습 니 다. register, unregister, notify Observer.notify Observer 방법 은 감청 대상 이 바 뀌 었 을 때 호출 합 니 다. 이 메 시 지 를 모든 감청 자 (Observer) register 방법 으로 Observer 에 게 제공 합 니 다. Observer 는 이 방법 을 호출 하면 notify Observer 에서 보 내 온 메시지 unregister 를 받 아 등록 을 취소 할 수 있 습 니 다. 2. 모든 감청 자 는 Observer 인 터 페 이 스 를 실현 합 니 다.이 인 터 페 이 스 는 감청 대상 이 변 할 때 이 방법 이 호출 되 는 update 방법 이 있 습 니 다.
public class Publisher implement Observable {
     
     //      ,                      
     private ArrayList<Observer> observerList;     

     public Publisher() {
          observerList = new ArrayList<Observer>;
     }

     @Override
     public void register(Observer ob) {
          observerList.add(ob);     //                         
     }

     @Override
     public void unregister(Observer ob) {
          int index = observerList.indexOf(o);
          if (index >= 0) {
               observerList.remove(index);
          }
     }
     
     //          list       ,         update  
     @Override
     public void notifyObserver() {
          for(int i = 0; i < observerList.size(); i++) {
               observerList.get(i).update;
          }
     }
}

public class Subscriber() implement Observer {
     
     private Publisher  publisher;
     
     //                   
     public Subscriber(Publisher  publisher) {
          this.publisher = publisher;
          publisher.register(this);
     }     
     
     @Override
     public void update() {
          //        
     }
}

 
Android 에서 의 응용 프로그램: Otto EventBusOtto 안 드 로 이 드 시스템 의 Event Bus 모드 라 이브 러 리 입 니 다.응용 구성 요소 간 통신 을 간소화 하기 위해 Read more: http://blog.chengyunfeng.com/?p=450Otto사용 방법: 구성 요소 와 관련 된 수명 주기 에 Bus 클래스 의 register 함 수 를 통 해 등록 한 다음 Bus 클래스 는 클래스 변경 에 @ Produce 와 @ Subscribe 주석 이 있 는 함 수 를 스 캔 합 니 다. @Subscribe 주 해 는 Bus 에 게 이 함수 가 이 벤트 를 구독 하 였 음 을 알려 줍 니 다. 이 이벤트 의 유형 은 이 함수 의 매개 변수 유형 입 니 다.한편, @ Produce 주 해 는 Bus 에 게 이 함수 가 이벤트 발생 자 이 고 발생 하 는 이벤트 유형 은 이 함수 의 반환 값 이 라 고 알려 줍 니 다.post 방법 은 이벤트 register 방법 을 발표 하 는 데 사 용 됩 니 다.
1. 우선 이 페이지 의 모든 pushisher 와 Subscribers 를 옮 겨 다 니 며 Subscriber 를 중점적으로 살 펴 보 겠 습 니 다. Subscribers 의 핵심 코드 는 다음 과 같 습 니 다. 
 Map<Class<?>, Set<EventHandler>> foundHandlersMap = handlerFinder.findAllSubscribers(object);  //    object    subscribe      
    for (Class<?> type : foundHandlersMap.keySet()) {   //      
      Set<EventHandler> handlers = handlersByType.get(type);    //               
      if (handlers == null) {
        //concurrent put if absent
        Set<EventHandler> handlersCreation = new CopyOnWriteArraySet<EventHandler>();
        handlers = handlersByType.putIfAbsent(type, handlersCreation);
        if (handlers == null) {
            handlers = handlersCreation;
        }
      }
      final Set<EventHandler> foundHandlers = foundHandlersMap.get(type);
      handlers.addAll(foundHandlers);   //    ,        handlersByType ,handlersByType          observerList
    }

 
2. 새로운 소비 가 발 송 될 때 post 방법 을 호출 합 니 다.
public void post(Object event) {
    if (event == null) {
      throw new NullPointerException("Event to post must not be null.");
    }
    enforcer.enforce(this);

    Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass());

    boolean dispatched = false;
    for (Class<?> eventType : dispatchTypes) {
      Set<EventHandler> wrappers = getHandlersForEventType(eventType); // handlersByType        ,         class      

      if (wrappers != null && !wrappers.isEmpty()) {
        dispatched = true;
        for (EventHandler wrapper : wrappers) {
          enqueueEvent(event, wrapper);
        }
      }
    }

    if (!dispatched && !(event instanceof DeadEvent)) {
      post(new DeadEvent(this, event));
    }

    dispatchQueuedEvents();
  }
     

좋은 웹페이지 즐겨찾기