资讯专栏INFORMATION COLUMN

JAVA设计模式-观察者模式

vvpale / 3361人阅读

摘要:观察者模式涉及的角色主题一对多中的一,持有数据,当数据更新时,通知已注册的观察者观察者一对多中的多,接收主题数据做出响应举个栗子一位妈妈主题有两个孩子,取名为小爱和小冰观察者。

概念

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

观察者模式涉及的角色

主题(Subject):一对多中的一,持有数据,当数据更新时,通知已注册的观察者

观察者(Observer):一对多中的多,接收主题数据做出响应

举个栗子

一位妈妈(主题)有两个孩子,取名为小爱和小冰(观察者)。一天小爱和小冰都去找她们的朋友玩,当到了吃饭的时间,妈妈总会打电话通知她们回来吃饭(孩子默认在妈妈那注册为观察者registerObserver),但中途小冰打电话和妈妈说:“不回来吃饭了,和朋友吃”(取消观察者这角色removeObserver)。所以最后,只有小冰收到妈妈的通知,并告诉她今天买了你喜欢吃的鸡腿(notifyObserver)。

代码

Person.java,Mother和Child都继承这个类[这步和讲述观察者模式没什么关系]

public class Person {
    private String name;

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


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Mother.java

public class Mother extends Person implements Subject{

    /**
     * 她要通知的孩子
     */
    private ArrayList children = new ArrayList<>();
    /**
     * 通知的内容
     */
    private String message;

    public Mother(String name) {
        super(name);
    }


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

    @Override
    public void removeObserver(Observer observer) {
        children.remove(observer);
    }

    @Override
    public void notifyObserver() {
        children.forEach(observer -> observer.message(message));
    }

    public void sendMessage(String message) {
        this.message = message;
        // 通知她们
        notifyObserver();
    }
}

Child.java

public class Child extends Person implements Observer{

    public Child(String name) {
        super(name);
    }

    @Override
    public void message(String m) {
        System.out.println(getName() + "收到的消息:"  + m);
    }
}

Main.java

public class Main {

    public static void main(String[] args) {
        Mother mother = new Mother("妈妈");
        Child xiaoBing = new Child("小冰");
        Child xiaoAi = new Child("小爱");

        // 孩子都是亲生的,吃饭时叫她们
        mother.registerObserver(xiaoBing);
        mother.registerObserver(xiaoAi);

        mother.sendMessage("饭煮好了,回来吃饭,买了你们想吃的鸡腿");

        System.out.println("------------------分割线-----------------------");
        // 小爱说不回来吃了,取消通知她
        mother.removeObserver(xiaoAi);
        mother.sendMessage("饭煮好了,回来吃饭,买了你们想吃的鸡腿");
    }
}

运行结果:

小冰收到的消息:饭煮好了,回来吃饭,买了你们想吃的鸡腿
小爱收到的消息:饭煮好了,回来吃饭,买了你们想吃的鸡腿
------------------分割线-----------------------
小冰收到的消息:饭煮好了,回来吃饭,买了你们想吃的鸡腿
优点

主题观察者之间松耦合。有新类型的观察者出现时,主题的代码不需要修改。假如我们有一个新的具体类需要当观察者,我们不需要为了兼容新类型而修改主题的代码,所有要做的就是在新的类里实现此观察者接口,然后注册成观察者即可。

就好比如上面例子,如果国家不久的将来开放三胎政策,妈妈又生了个小娜,妈妈不需要修改自身的逻辑。如果孩子要回家吃饭就实现Observer接口,妈妈那registerObserver就OK。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76884.html

相关文章

  • Java 设计模式察者模式

    摘要:三内置观察者模式了解内置观察者模式包内包含最基本的类与接口,这和上面的接口与接口很类似。根据具体的需求,如果内置的观察者模式不能满设计,那么我们可以像刚开始那样自己实现一套观察者模式。参考资料设计模式 一、了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。 典型的问题比如报社,只要你是他...

    jsummer 评论0 收藏0
  • Java设计模式察者模式

    摘要:观察者模式的使用场景比如你微博关注了一个人,那么这个人发布的微博就会推送到你这。 Java设计模式之观察者模式 一直想写一篇学习观察者模式的总结没有契机,今天学习阻塞队列的原理时候看到在实现生产者消费者的时候用到了通知模式,就是所谓的观察者模式,正好顺便整理一下。 1. 简介 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更...

    haitiancoder 评论0 收藏0
  • 我的Java设计模式-察者模式

    摘要:为了帮助灰太狼摆脱被老婆平底锅抽的悲剧,发起了解救灰太狼的行动,必须要知道观察者模式。持有观察者对象的集合。设计模式源码下载 相信大家都有看过《喜洋洋与灰太狼》,说的是灰太狼和羊族的斗争,而每次的结果都是灰太狼一飞冲天,伴随着一句我还会回来的......。为灰太狼感到悲哀,抓不到羊,在家也被老婆平底锅虐待。灰太狼为什么会这么背? 很简单,灰太狼本身就有暴露行踪的属性,羊咩咩就能知晓灰太...

    smartlion 评论0 收藏0
  • 自我理解-察者(Observer)模式

    摘要:观察者模式观察者模式也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观察者,多是观察者,故被观察者不能产生多个对象,只能有一个对象供观察者观察,所以在写被观察者的时候,需要使用到单例模式。 观察者(Observer)模式 观察者(Observer)模式 也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观...

    xuweijian 评论0 收藏0

发表评论

0条评论

vvpale

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<