设计模式之观察者模式

设计模式之观察者模式

观察者模式简介

观察者模式,二十三种设计模式之一,也是一种使用频率比较高的设计模式。在日常生活中,我们经常会碰到这样的情景,比如说某个事情发生了,我们希望通知到所有对这个事情关系的人,这个时候有两种方式,一种是关心这件事的人主动去询问发布这件事情的人;另外一种就是告诉这件事情的负责人,让他在这件事情发生的时候,告诉我们这件事情已经发生了。显然,第一种方式是属于主动模式,这种方式在这种情况下是比较不方便的,因为我们不知道这件事情什么时候会发生,所以我们需要不停地去询问负责人,这样效率就会变得非常低,而且不方便;第二种方式就是我们的观察者模式了,我们注册对应的事件,然后在该事件发生的时候,由负责人通知我们即可,这样我们就不需要关心它到底什么时候发生的了。

观察者模式的具体实现


/**
 * 观察者接口
 */
interface Observer {

    void update(Subject subject);
}

/**
 * 对应的事件
 */
class Subject{

    private List<Observer> observers ;
    private int status;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
        // 当状态改变的时候,通知所有的观察者
        notifyAllObserver();
    }

    public Subject() {
        this.observers = new ArrayList<>();
    }

    /**
     * 注册观察者
     * @param observer
     */
    public void register(Observer observer){
        observers.add(observer);
    }

    /**
     * 移除观察者
     * @param observer
     */
    public void remove(Observer observer){
        observers.remove(observer);
    }

    /**
     * 通知所有的观察者
     */
    private void notifyAllObserver(){
        for (Observer obs:observers) {
            obs.update(this);
        }
    }
}

/**
 * 具体的观察者
 */
class ObserverOne implements Observer{

    @Override
    public void update(Subject subject) {
        System.out.println( this + "Update : " + subject.getStatus());
    }
}

/**
 * 具体的观察者
 */
class ObserverTwo implements Observer{

    @Override
    public void update(Subject subject) {
        System.out.println( this + "Update : " + subject.getStatus());
    }
}

可以看到,我们只需要定义一个观察者接口,并且在对应事件提供注册的接口即可,这样,根据具体情况,可以有不同类型的观察者,主要他们对这个事情感兴趣,那么只需要注册一下该事情,当发生改变的时候,他们就都会受到通知,这跟生活中遇到的情况是一致的。

总结

观察者模式,是一种比较巧妙的设计模式,它将获得事件通知的控制权从用户转移到事件本身,使得用户可以从这个事件变化中解脱出来,观察者模式可以用于实现类似于广播、通知这一类型的模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值