观察者模式

最近在研究RxJava,其中将观察者模式用到极致。在继续深入学习之前我特意总结下观察者模式。

观察者模式(Observer)又称分发-订阅模式。即目标更新会使注册了的观察者发生更新。一个目标可以有多个观察者。是一种一对多的关系。

最简单的例子:
出版社发新书,读者收到消息可以读新书
这里出版社其实就是目标,而读者就是观察者。

编码实现:
抽象目标:抽象类或接口
抽象观察者:抽象类或接口
具体目标:抽象类或接口的继承或实现
具体观察者:抽象类或接口的继承或实现

抽象目标:
持有对观察者的引用,用来注册和取消注册订阅

//目标 
public interface IObserver {
    void register(ISubScribe subject);
    void removeRegister(ISubScribe subject);
    void sendMes();
}

抽象观察者

//观察者
public interface ISubScribe {
    void update();
}

具体目标:

public class NewsPaper implements IObserver {

    List<ISubScribe> list = new ArrayList<ISubScribe>();

    public void register(ISubScribe subject) {
        list.add(subject);
    }

    public void removeRegister(ISubScribe subject) {
        if(list.indexOf(subject)>=0){
            list.remove(subject);
        }
    }

    public void sendMes() {
        for (ISubScribe subject : list) {
            subject.update();
        }
    }
}

具体观察者:

public class Reader implements ISubScribe {

    String name;

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

    public void update() {
        // TODO Auto-generated method stub
        System.out.println(name+"  收到最新报纸了");
    }

}

实现:

public class MainTest {

    public static void main(String[] args) {
        NewsPaper newsPaper = new NewsPaper();

        Reader reader1 = new Reader("小美");
        Reader reader2 = new Reader("小盛");
        Reader reader3 = new Reader("小占");

        newsPaper.register(reader1);
        newsPaper.register(reader2);
        newsPaper.register(reader3);

        newsPaper.sendMes();

        //取消订阅
        newsPaper.removeRegister(reader3);

        newsPaper.sendMes();

    }

}

输出结果:

小美  收到最新报纸了
小盛  收到最新报纸了
小占  收到最新报纸了

小美  收到最新报纸了
小盛  收到最新报纸了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值