관찰자 모드 구현 이벤트 버스 (Google)

4436 단어 디자인 모드
관찰자 모드 는 게시 - 구독 (Publish / subscribe) 모드 라 고도 부 르 며 한 쌍 의 다 중 의존 관 계 를 정의 하여 여러 관찰자 대상 이 특정한 주제 대상 을 동시에 감청 하도록 한다.이 테마 대상 이 상태 에 변화 가 생 겼 을 때 모든 관찰자 대상 에 게 자동 으로 자신 을 업데이트 할 수 있 도록 알려 줍 니 다. 우 리 는 메시지 대기 열 을 생각 할 수 있 지만 같은 JVM 프로 세 스에 서 이러한 관찰자 모드 를 실현 하려 면 어떻게 해 야 합 니까?JDK 에 내 장 된 java. util. Observer 를 생각 하거나 코드 를 직접 작성 할 수도 있 습 니 다. 사실 Google 에서 제공 하 는 guava 공구 꾸러미 도 비슷 한 실현 이 있 습 니 다. 이것 이 바로 EventBus 입 니 다. github 에서 guava 의 wiki 를 통 해 eventbus 의 wiki 정 보 를 찾 을 수 있 습 니 다. 주 소 는?https://github.com/google/guava/wiki/EventBusExplained, 예제 demo 는 다음 과 같 습 니 다.
public class EventBusFactory {

    private static final EventBus eventBusInstance = new EventBus();

    private EventBusFactory() {
    }

    /**
     *       
     * @return
     */
    public static EventBus getInstance(){
        return eventBusInstance;
    }

    /**
     *        
     * @param object
     */
    public static void register(Object object){
        eventBusInstance.register(object);
    }


    /**
     *          
     * @param object
     */
    public static void unRegister(Object object){
        eventBusInstance.unregister(object);
    }

    /**
     *     
     * @param object
     */
    public static void post(Object object){
        eventBusInstance.post(object);
    }
}

public class OrderEvent {
    private Long orderId;
    private Integer changeType;

    public OrderEvent(Long orderId, Integer changeType) {
        this.orderId = orderId;
        this.changeType = changeType;
    }


    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public Integer getChangeType() {
        return changeType;
    }

    public void setChangeType(Integer changeType) {
        this.changeType = changeType;
    }
}

public class OrderMsgObserver {

    @Subscribe
    public void OrderSyncToMq(OrderEvent event) {
        Integer changeType= event.getChangeType();
        Long orderId =  event.getOrderId();
        System.out.println("      MQ-》  Id:"+orderId+"&    :"+changeType);
        String msgInfo="";
        if(changeType ==1){
            msgInfo="this order has been issued";
        }else if(changeType ==2){
            msgInfo ="this order has been finshed";
        }else if(changeType ==0){
            msgInfo="this order has been cancel ";
        }
        writeMq(orderId,msgInfo);
    }


    public static void writeMq(Long orderId,String msgInfo){
        System.out.println("  MQ  -》orderId:"+orderId+"&    "+msgInfo);
    }
}


public class OrderSyncDbObserver {


    @Subscribe
    public void OrderSyncToDb(OrderEvent event) {
       Integer changeType= event.getChangeType();
       Long orderId =  event.getOrderId();
       System.out.println("      -》  Id:"+orderId+"&    :"+changeType);
       String orderInfo="";
        if(changeType ==1){
            orderInfo="The order has been issued";
        }else if(changeType ==2){
            orderInfo ="The order has been finshed";
        }else if(changeType ==0){
            orderInfo="The order has been cancel ";
        }
        writeDb(orderId,orderInfo);
    }


    public static void writeDb(Long orderId,String orderInfo){
       System.out.println("    -》orderId:"+orderId+"&    "+orderInfo);
    }
}


 @Test
    public void testEventBus(){
        OrderSyncDbObserver orderSyncDbObserver =new OrderSyncDbObserver();
        OrderMsgObserver orderMsgObserver =new OrderMsgObserver();
        System.out.println("       ");
        EventBusFactory.getInstance().register(orderSyncDbObserver);
        System.out.println("        ");
        EventBusFactory.getInstance().register(orderMsgObserver);
        Long orderId=1298932323L;
        System.out.println("      -》  Id:"+orderId);
        EventBusFactory.getInstance().post(new OrderEvent(orderId,1));
        System.out.println("      -》  Id:"+orderId);
    }

테스트 결 과 는 다음 과 같다.
       
        
      -》  Id:1298932323
      -》  Id:1298932323&    :1
    -》orderId:1298932323&    The order has been issued
      MQ-》  Id:1298932323&    :1
  MQ  -》orderId:1298932323&    this order has been issued
      -》  Id:1298932323

 

좋은 웹페이지 즐겨찾기