设计模式之观察者模式

什么是观察者模式?

定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖他的对象都会得到通知并被自动更新。

观察者模式用在哪?

观察者模式的典型应用就是在类似的“订阅—发布”系统。我们都用过邮箱,这里以QQ邮箱为例,我们可以在邮箱中进行订阅某个订阅号,之后每次我们就可以收到该订阅号发送过来的资讯信息。在这里我们就相当于观察者,订阅号就是被观察者,被观察者更新了数据,我们观察者就可以看到具体的变化。

观察者模式实现

我们就以上述的“订阅–发布”为例子,具体的展示下观察者模式

  1. 我们先来看下观察者代码

    //Observer 是JDK内置接口,我们可以直接使用
    public class Coder implements Observer {
    private String sName;
    
    public Coder(String name) {
        sName = name;
    }
    
    @Override
    public void update(Observable observable, Object data) {
        System.out.println("我的名字是:" + sName + ",内容已经更新:" + data);
    }
    }
    

    观察者实现Observer接口,并实现update方法。

  2. 接下来实现被观察者代码

    //Observable 属于JDK内置类
    public class DevTechFrontier extends Observable {
    //定义一个方法,提供内容内容更新入口
    public void postNewPublication(String content){
        //标识状态或者内容发生改变
        setChanged();
        //通知所有观察者
        notifyObservers(content);
    }
    }

    被观察者继承Observable类,之后我们定义一个方法,提供内容更新入口

  3. 调用过程

    public class MainTest {
    public static void main(String[] args) {
        //实例化被观察者对象
        DevTechFrontier devTechFrontier =new DevTechFrontier();
        //创建观察者
        Coder coder1 =new Coder("coder1");
        Coder coder2 =new Coder("coder2");
        Coder coder3 =new Coder("coder3");
        Coder coder4 =new Coder("coder4");
    
        //将观察者注册到可观察对象的观察者列表中
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);
        devTechFrontier.addObserver(coder3);
        devTechFrontier.addObserver(coder4);
    
        //更新消息
        devTechFrontier.postNewPublication("我们发布了新内容");
    }
    }
    
  4. 显示结果(注意打印顺序和注册顺序相反)

    我的名字是:coder4,内容已经更新:我们发布了新内容
    我的名字是:coder3,内容已经更新:我们发布了新内容
    我的名字是:coder2,内容已经更新:我们发布了新内容
    我的名字是:coder1,内容已经更新:我们发布了新内容

观察者模式分析
  • 观察者模式一个重要的功能就是解耦,将观察者和被观察者解耦,使得他们的依赖降低,甚至毫无依赖,增强了系统灵活性,可拓展性。

  • 在应用观察者模式的时候,要考虑下开发效率和运行效率问题,程序包括一个被观察者和若干个观察者,开发调试的工作量较大。

源码补充

详情请看:Observer与Observable源码分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值