发布订阅模式使用

    最近早上地铁上一直看设计模式,代码中却使用不上,今天恰好碰到一个新需求,感觉和发布订阅模式有点相同,借用了一下理念,虽然代码写的很烂,但是还是第一次去试着用设计模式,记录一下成长的第一步。

    需求大概是,往前端推送数据的时候,因为涉及到整个北京市的数据和北京市各个地区的数据,当前端不给我发送请求的时候,我这边是正常推整个北京市新增的数据,而当前端给我发送请求的时候,会带着某个区的行政编码,这时候我发送整个北京市数据就要停止,转而给推送这个区的数据,而当前端发请求通知我改为整个北京市数据的时候,再次改变,我把前端的请求当做通知者,根据请求的不同改变查阅的状态,把我的推送当做订阅者,根据发布者查阅状态的变化,推送不同的数据。

  通知者代码如下

@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();
    }

观察者代码如下

@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()方法时,就会给推送对应的数据了。

 

posted @ 2018-09-04 17:27  竹马今安在  阅读(313)  评论(1编辑  收藏  举报