观察者模式

观察者模式是jdk中使用的最多的一种设计模式,它可以通知给对象想知道的一切,甚至可以在对象运行时决定是否继续被通知。
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新,观察者模式可以使你的程序松耦合。

出版者+订阅者=观察者模式

更详细的博客说明请点击:这里

下面的类图便是一个最简单的观察者模式,由主题接口、主题、观察者接口、观察者四部分组成。

观察者类图

1.Subject主题接口。对象使用此接口注册成为观察者,或者把自己从观察者中移除。每个主题都可以有很多观察者。

public interface Subject {

    public void registerObserver(Observer observer);

    public void removeObserver(Observer observer);

    // 主题改变时,这个方法会被调用,以通知所有的观察者
    public void notifyObserver();
}

2.StatusData具体的接口。一个具体的主题必须实现主题接口,除了注册和移除外,具体的主题还实现了notifyObserver,此方法用于在状态改变时通知所有当前观察者。

public class StatusData implements Subject {

    private List<Observer> observerList;

    private String status;

    public StatusData() {
        observerList = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        boolean isContains = observerList.contains(observer);
        if(isContains) {
            observerList.remove(observer);
        }
    }

    @Override
    public void notifyObserver() {
        for(Observer observer : observerList) {
            observer.update(status);
        }
    }

    public void updateStatus(String status) {
        this.status = status;
        notifyObserver();
    }
}

3.Observer观察者接口。只有一个update方法。所有潜在的观察者必须实现观察者接口。

public interface Observer {

    public void update(String status);
}

4.ObserverA具体的观察者。可以是实现观察者接口的任意类,观察者必须注册具体的主题,以便接受更新。

public class ObserverA implements Observer {

    private Subject statusData;

    public ObserverA(Subject statusData) {
        this.statusData = statusData;
        this.statusData.registerObserver(this);
    }

    @Override
    public void update(String status) {
        System.out.println("ObserverA update:" + status);
    }
}

5.ObserverB也是一个具体的观察者。

public class ObserverB implements Observer {

    private Subject statusData;

    public ObserverB(Subject statusData) {
        this.statusData = statusData;
        this.statusData.registerObserver(this);
    }

    @Override
    public void update(String status) {
        System.out.println("ObserverB update:" + status);
    }
}

6.Test类用来测试

public class Test {

    public static void main(String[] args) {
        StatusData statusData = new StatusData();
        Observer observerA = new ObserverA(statusData);
        Observer observerB = new ObserverB(statusData);
        statusData.updateStatus("1");
        statusData.updateStatus("2");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值