栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式-观察者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式-观察者模式

观察者模式定义

观察者模式定义对象之间的一对多以来,这样以来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式理解

结合下面的观察者模式类图。

首先,我们要知道观察者就是那群等待被通知的人,被观察者就是当数据变换要去通知观察的人。

那么被观察者怎么知道要通知哪些人呢?

通过注册的方式,这个时候只要你需要被通知,那么你就要向我注册,那么你想要注册,就要调用被观察者的注册方法,所以观察者要拥有被观察者的对象。

然后由于为了注册方法的复用性强,所以所有的观察者都需要去统一的实现某个接口,这个时候就可以利用多态,被观察者只需要保存一个这个接口的列表即可。

然后如果有数据变化,那么就遍历列表通知所有已经注册的观察者。

松耦合(新的设计原则)

当两个对象之间松耦合时,它们可以交互,但通常对彼此所知甚少。

①首先,主题知道观察者的唯一事情时,它实现了某个接口(观察者接口)。它不需要知道观察者的具体类,它做什么或者关于它的其它事情。

②它可以在任何时候添加新的观察者。因为主题唯一依赖的东西时实现观察者接口的对象列表,我们可以在想要添加的时候,添加新的观察者。事实上,我们可以在运行时替换任意观察者为另一观察者,主题不会收到影响。同样,我们可以在任何时候移除观察者。

③要添加新的类型的观察者,我们绝对不需要修改主题。假如我们有个新的具体类需要当观察者,并不需要对主题的代码做任何修改来兼容新的类型;我们只需要在新类中实现观察者接口并注册为一个观察者。主题不关心这个,它会发通知给所有实现了观察者接口的对象。

④我们可以彼此独立地复用主题或观察者。如果我们在其它地方需要使用主题或观察者。我们可以轻松地服用,因为二者并非紧密耦合。

⑤改变主题或观察者的一方,不会影响另一方。因为二者是松耦合的,所以我们可以自由的改变任何一方,只要对象依然满足约定,实现主题或观察者接口。

观察者模式类图

 依据观察者模式类图的代码实现示例
//被观察者
public interface Subject {

    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyAllObserver();
}

//被观察对象
public class Observable implements Subject{

    private List observerList;

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

    @Override
    public void registerObserver(Observer o) {
        if (!observerList.contains(o)){
            observerList.add(o);
        }
    }

    @Override
    public void removeObserver(Observer o) {
        if (observerList.contains(o)){
            observerList.remove(o);
        }
    }

    @Override
    public void notifyAllObserver() {
        for (Observer o: observerList) {
            o.update();
        }
    }

}

//观察者
public interface Observer {

    void update();

}

public class Observer1 implements Observer {

    @Override
    public void update() {
        System.out.println("我是Observer1");
    }

}

public class Observer2 implements Observer{

    @Override
    public void update() {
        System.out.println("我是Observer2");
    }

}

提醒:如果说,被观察中有一些参数,当这些参数变化时要通知观察者,此时可以考虑让每个具体的观察者对象拿到具体的被观察者对象,然后update中将不更新任何参数,而有观察者通过被观察者对象自由获取。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820177.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号