小白谈谈观察者模式

概念

这是一个十分容易理解的模式,当一个对象(被观察者)的属性发生变化,或者该对象调用某些方法,所有依赖它的对象(观察者)发生一系列变化。

实现

案例:我是一个996的程序员,喜欢哈士奇,在自己的出租屋里养了一只哈士奇,不过由于工作原因,没能常常在家,于是我就在上班的时候,给哈士奇放置一天的食物和水,供它一天吃饱喝足。不过哈士奇都有一个天性——拆家,于是我就安装了一个智能摄像头,用于观察我的哈士奇有没有拆家。

实现代码如下:
首先定义一个狗的接口:

public interface  Dog {

    //拆家
    public void destroy();
}

定义一个二哈的类,是狗接口的具体实现:

public class ErHa implements Dog {

    //实例一个摄像头,用于观察二哈的行为
    private Monitoring monitoring = new Monitoring();

	//二哈要拆家了
    @Override
    public void destroy() {
        System.out.println("我要开始拆家了!!!");
        //摄像头发出警报
        monitoring.call();
    }

}

定义一个观察者的接口:

public interface Observer {

    //一旦发现二哈在拆家,就做出某些行为
    public void call();
}

定义一个摄像头的类,实现观察者接口的:

public class Monitoring implements Observer {

    public Monitoring() {}

	//发现二哈在拆家,发出警报
    @Override
    public void call() {
        System.out.println("biu biu biu biu。。。。");
        System.out.println("摄像头:主人!二哈在拆家!");
    }
}

最后定义主人进行测试:

public class Owner {

    public static void main(String[] args) {

        //定义出二哈
        ErHa erHa = new ErHa();

        //二哈开始拆家
        erHa.destroy();
    }
}

实验结果:
在这里插入图片描述

案例升级:二哈拆家能力太强了,把我的摄像头也拆掉了,我需要买一个新的摄像头,而且我还叫包租婆不定时过来帮我看看屋子有没有被拆掉。
所以观察者的数量有变化,那么就会涉及观察者的增加和删除,不过JDK中提供了java.util.Observable 实现类和 java.util.Observer 接口,接下来是对代码的进一步升级:

定义一个二哈的类:

public class ErHa extends Observable implements Dog {

    @Override
    public void destroy() {
        System.out.println("我要开始拆家了!!!");
        super.setChanged();

        //通知所有观察者
        super.notifyObservers();
    }

}

定义一个摄像头的类:

public class Monitoring implements Observer {

    //发现二哈在拆家,发出警报
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("biu biu biu biu。。。。");
        System.out.println("摄像头:主人!二哈在拆家!");
    }
}

定义一个包租婆的类:

public class BaoZuPo implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("小寸,你家的狗又在拆家了!你快回来!");
    }
}

我的测试类:

public class Owner {

    public static void main(String[] args) {

        //定义出二哈
        ErHa erHa = new ErHa();

        //定义观察者
        BaoZuPo baoZuPo = new BaoZuPo();
        Monitoring monitoring = new Monitoring();

        //给二哈添加观察者
        erHa.addObserver(baoZuPo);
        erHa.addObserver(monitoring);

        //二哈开始拆家
        erHa.destroy();
    }
}

实验结果:
在这里插入图片描述


注意:如果观察者较多的情况下,需要使用异步处理,使用异步处理的时候需要考虑线程安全和队列问题。


本文的代码:https://pan.baidu.com/s/1ILC5YVJ7u6deUTY2W04XqA
提取码:6tre

发布了48 篇原创文章 · 获赞 0 · 访问量 663

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105223626
今日推荐