2.设计模式-观察者模式(发布-订阅模式)

观察者模式(发布-订阅模式)一个简单的使用

简介

观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(来源百度百科)

例子

观察者模式他类似于发布-订阅模式,通过一方的改变去通知改变另一方的改变,好比微信公众号,我们通过关注某个微信公众号,当公众号发布文章时,我们就会收到通知,看到文章内容,JDK的java.util包提供了两个类Observer、Observable
现在瞧瞧下面的小栗子:

被监听者(被观察者)

/**
 * 公众号 -- 被监听者(被观察者)
 */
public class OfficeObServable extends Observable {
    // 公众号名
    private String name;

    public OfficeObServable(String name){
        this.name = name;
    }

    public void news(String info){
        System.out.println("公众号【" + name + "】更新内容啦!");
        this.setChanged();
        this.notifyObservers(info);
    }
}

监听者(观察者)

/**
 * 用户 -- 监听者(观察者)
 */
public class UserObServer implements Observer {
    // 用户名
    private String name;
    
    public UserObServer(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("用户【"+name+"】获取通知:"+arg);
    }
}

由此可看出:

  1. 被观察者:我们只需要继承Observable 类,然后写一个新的方法,比如news()发布新的资讯,this.setChanged(); 表示被观察者发生了改变,而 this.notifyObservers(info);则表示将改变的内容info,发给所有的订阅者。
  2. 观察者:需要实现Observer 接口,并且实现Observer 接口中的update(Observable o, Object arg);方法,这里就是上面的被观察者调用notifyObservers()方法后执行的方法,update()方法将获取被观察者的更新内容。

测试类

@Test
public void ObServableTest(){
    // 两个公众号
    OfficeObServable officeObServable1 = new OfficeObServable("java知音");
    OfficeObServable officeObServable2 = new OfficeObServable("程序猿DD");
    // 三个用户
    UserObServer userObServer1 = new UserObServer("大雄");
    UserObServer userObServer2 = new UserObServer("丁香");
    UserObServer userObServer3 = new UserObServer("胖虎");
    // 大雄、丁香、胖虎都订阅java知音
    officeObServable1.addObserver(userObServer1);
    officeObServable1.addObserver(userObServer2);
    officeObServable1.addObserver(userObServer3);
    // 丁香、胖虎订阅程序猿DD
    officeObServable2.addObserver(userObServer2);
    officeObServable2.addObserver(userObServer3);
    // 公众号推文
    officeObServable1.news("MyBatis内容聚合");
    officeObServable2.news("Spring  Batch入门教程");
}

执行结果

公众号【java知音】更新内容啦!
用户【胖虎】获取通知:MyBatis内容聚合
用户【丁香】获取通知:MyBatis内容聚合
用户【大雄】获取通知:MyBatis内容聚合
公众号【程序猿DD】更新内容啦!
用户【胖虎】获取通知:Spring  Batch入门教程
用户【丁香】获取通知:Spring  Batch入门教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值