發佈訂閱模式使用

    最近早上地鐵上一直看設計模式,代碼中卻使用不上,今天剛好碰到一個新需求,感受和發佈訂閱模式有點相同,借用了一下理念,雖然代碼寫的很爛,可是仍是第一次去試着用設計模式,記錄一下成長的第一步。前端

    需求大概是,往前端推送數據的時候,由於涉及到整個北京市的數據和北京市各個地區的數據,當前端不給我發送請求的時候,我這邊是正常推整個北京市新增的數據,而當前端給我發送請求的時候,會帶着某個區的行政編碼,這時候我發送整個北京市數據就要中止,轉而給推送這個區的數據,而當前端發請求通知我改成整個北京市數據的時候,再次改變,我把前端的請求當作通知者,根據請求的不一樣改變查閱的狀態,把個人推送當作訂閱者,根據發佈者查閱狀態的變化,推送不一樣的數據。設計模式

  通知者代碼以下api

@RestController
@RequestMapping("/api/notify")
public class ZoneSubject {

    @Resource(name = "zoneObserver")
    private Observer observer;

    private Boolean state;

    private Integer zone;
    
    public void Notify(){

            observer.update();
    }
    
    @RequestMapping("/city")
    public  void updateState(){
        this.state=true;
        this.Notify();
    }

    @RequestMapping("/area/{zone}")
    public  void getTip(@PathVariable Integer zone){
        this.state=false;
        this.zone=zone;
        this.Notify();
    }

觀察者代碼以下app

@Component(value = "zoneObserver")
public class ZoneObserver extends  Observer{

    @Resource
    private ZoneSubject zoneSubject;


    @Resource(name = "alarmToTVService")
    private AlarmToTVService alarmToTVService;

    private Boolean state=false;

    private Integer zone=110000;

    @Override
    public void update() {
        this.state=zoneSubject.getState();
        this.zone=zoneSubject.getZone();
    }


    public void  sendTip(String type){
        if(type.equals("0")){
            alarmToTVService.sendTipFocusToTV(type);
        }else {
            if (state) {
                alarmToTVService.sendTipFocusToTV(type);
            } else {
                alarmToTVService.sendTipFocus(type, zone);
            }
        }
    }
}

其他地方調用觀察者的sendTip()方法時,就會給推送對應的數據了。ide

相關文章
相關標籤/搜索