初识观察者模式

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

编写被观察者类

package com.atwu.miao.obserable;

import com.atwu.miao.vo.CatVo;
import org.springframework.stereotype.Component;

import java.util.Observable;

@Component
public class CatObservable extends Observable {

    public void change(CatVo vo){
        this.setChanged();
        this.notifyObservers(vo);
        System.out.println("已经通知观察者");
    }
}

编写观察者类

package com.atwu.miao.observer;

import com.atwu.miao.obserable.CatObservable;
import com.atwu.miao.vo.CatVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Observable;
import java.util.Observer;

@Component
public class CatObserver implements Observer {

    @Autowired
    private CatObservable catObservable;

    @PostConstruct
    private void addObserver(){
        catObservable.addObserver(this);
    }


    @Override
    public void update(Observable o, Object arg) {
        if (!(arg instanceof CatVo)){
            return;
        }
        System.out.println("观察者1运行");
        CatVo catVo = (CatVo) arg;
        System.out.println(catVo.getName()+":"+catVo.getAge());
    }
}

我多复制了一个观察者,后面会看到两个观察者输出日志。

编写一个controller用于触发被观察者变化

package com.atwu.miao.controller;

import com.atwu.miao.obserable.CatObservable;
import com.atwu.miao.vo.CatVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/observer")
public class ObserverController {

    @Autowired
    private CatObservable catObservable;

    @RequestMapping("/change")
    @ResponseBody
    public String change(){
        CatVo catVo = new CatVo();
        catVo.setName("wu");
        catVo.setAge(19);
        catObservable.change(catVo);
        return "请求完成";
    }
}

访问“/observer/change”,控制台输出如下

2020-09-23 14:51:04.926  INFO 394236 --- [nio-9091-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-23 14:51:04.926  INFO 394236 --- [nio-9091-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-09-23 14:51:04.931  INFO 394236 --- [nio-9091-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
观察者2运行
wu:19
观察者1运行
wu:19
已经通知观察者

总结:

1、观察者需要实现Observer接口,重写update方法。
2、被观察者需要继承Observable类。
3、要想观察者能观察到被观察者的改变,需要被观察者调用addObserver(需要添加的观察者)方法添加观察者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值