Java设计模式之观察者模式

观察者模式定义了对象间的一种一对多的组合关系,即一个被观察者可以对应多个观察者,当被观察者状态发生变化的时候,所有依赖于它的观察者都将收到通知并自动更新

实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——取消注册”的形式,如EventBus,RxJava都是使用观察者模式实现的

名词解析
Subject、Observable:被观察者
Subscriber、Observer:观察者

实现观察者模式

这里以乔布斯的苹果公司和使用iphone手机的消费者举例,苹果公司好比是被观察者,消费者是观察者,每当苹果公司需要让手机系统更新时,都会自动通知持有iphone手机的消费者

代码示例

定义被观察者接口和被观察者实现类

/**
 * Created by yunzhao.liu on 2017/12/27
 * 被观察者接口
 */
public interface Subject {
    /**
     * 注册观察者
     * @param o 观察者
     */
    void registerObserver(Observer o);

    /**
     * 取消注册观察者
     * @param o 观察者
     */
    void unregisterObserver(Observer o);

    /**
     * 通知所有观察者
     */
    void notifyObservers(String info);
}


/**
 * Created by yunzhao.liu on 2017/12/27
 * 被观察者实现类
 */
public class AppleIncSubject implements Subject {

    //用来存放观察者
    private ArrayList<Observer> list = new ArrayList<>();

    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }

    @Override
    public void unregisterObserver(Observer o) {
        list.remove(o);
    }

    @Override
    public void notifyObservers(String info) {
        for (Observer o : list) {
            o.update(info);
        }
    }

    /**
     * 更新版本信息
     */
    public void updateVertion(String info) {
        this.notifyObservers(info);
    }
}

定义观察者接口和观察者实现类

/**
 * Created by yunzhao.liu on 2017/12/27
 * 观察者接口
 */
public interface Observer {

    /**
     * 每个观察者都需要实现该方法
     * 当被观察者状态发生改变时,通知每个观察者去更新
     *
     * @param info 更新信息
     */
    void update(String info);

}

/**
 * Created by yunzhao.liu on 2017/12/27
 * 观察者实现类
 */
public class ConsumerObserver implements Observer{

    //消费者姓名
    private String name;

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

    @Override
    public void update(String info) {
        System.out.println(name+"已更新版本到:"+info);
    }
}

执行类

/**
 * Created by yunzhao.liu on 2017/12/27
 */

public class TestChange {
    public static void main(String[] args) {
        AppleIncSubject subject = new AppleIncSubject();

        ConsumerObserver observer1 = new ConsumerObserver("小明");
        ConsumerObserver observer2 = new ConsumerObserver("小芳");
        ConsumerObserver observer3 = new ConsumerObserver("小红");

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.registerObserver(observer3);

        subject.updateVertion("1.1.1");
    }
}

在观察者模式中,又分为推模型和拉模型两种方式。上面的例子就是典型的推模型,即向观察者推送详细信息,而拉模型是向观察者推送少量信息,更具体的信息则由观察者自己去被观察者对象中去取,一般会把被观察者推送给观察者。

以上就是观察者模式的简单使用,当然真实使用中还需要考虑多线程同步等问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值