实战java设计模式(十八)观察者模式

1 介绍

当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

2 例子

假设有一个自然灾害观测站,当发生灾害的时候要通知到每一个在这里注册登记过的电视台,并且要第一时间播报给观众。

2.1 观察者接口

abstract class Observer {
    //向本台观众发送灾难预警
    public abstract void warning(String disaster);
}

观察者必须要第一时间把消息播放给观众。

2.2 观察者实体

//中央电视台
class CCTV extends Observer {
    //构造CCTV对象的时候就把CCTV在观察站注册了
    CCTV(DisasterStation disasterStation) {
        disasterStation.add(this);
    }

    @Override
    public void warning(String disaster) {
        System.out.println("中央电视台提醒您:" + disaster + "即将到来!!!");
    }
}
//四川电视台
class SCTV extends Observer {
    SCTV(DisasterStation disasterStation) {
        disasterStation.add(this);
    }

    @Override
    public void warning(String disaster) {
        System.out.println("四川电视台提醒您:" + disaster + "即将到来!!!");
    }
}
//山东电视台
class SDTV extends Observer {

    SDTV(DisasterStation disasterStation) {
        disasterStation.add(this);
    }

    @Override
    public void warning(String disaster) {
        System.out.println("山东电视台提醒您:" + disaster + "即将到来!!!");
    }
}

注意电视台的构造函数,里面的参数是被观察的对象,被观察者把这个观察者添加到注册列表。

2.3 被观察者

//自然灾害观察站
class DisasterStation {
    //存放电视台的注册信息
    List<Observer> list = new ArrayList<>();

    //添加注册
    public void add(Observer observer) {
        list.add(observer);
    }

    //监测到地震
    public void happen(String disaster) {
        //通知所有的观察者
        Iterator<Observer> iterator = list.listIterator();
        while (iterator.hasNext()) {
            iterator.next().warning(disaster);
        }
    }
}

要有一个注册列表,有添加功能(当然也有删除功能),还有发生灾害的时候要能直接调用电视台的预警方法展示给观众。

2.4 测试主类

public class Main {
    public static void main(String[] args) {
        //创建观测站对象
        DisasterStation disasterStation = new DisasterStation();

        //创建电视台对象
        Observer cctv = new CCTV(disasterStation);
        Observer sctv = new SCTV(disasterStation);
        Observer sdtv = new SDTV(disasterStation);

        //当灾害发生的时候
        disasterStation.happen("地震");
        disasterStation.happen("海啸");
    }
}

运行结果:

中央电视台提醒您:地震即将到来!!!
四川电视台提醒您:地震即将到来!!!
山东电视台提醒您:地震即将到来!!!
中央电视台提醒您:海啸即将到来!!!
四川电视台提醒您:海啸即将到来!!!
山东电视台提醒您:海啸即将到来!!!

3 总结

观察者模式很好的实现了当一个对象发生变化的时候,要通知到所有关心这个变化的对象。适用场景非常多。

3.1 核心角色

  • 观察者接口:当观察到变化的时候,观察者应该有方法去接受处理这个变化。
  • 观察者实体:实现观察处理变化的方法。同时在自己被创建的时候就应该去被观察者那里注册。
  • 被观察者类:维护一个观察者的注册列表,添加删除观察者的方法,当自己变化的时候,把变化通知给每一个观察者。

3.2 核心代码结构

被观察者维护一个观察者的列表,一有变化就通知观察者。注意和享元模式的异同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值