当前位置: 萬仟网 > IT编程>软件设计>设计模式 > 设计模式原来这么简单-观察者模式

设计模式原来这么简单-观察者模式

2020年12月31日  | 萬仟网IT编程  | 我要评论
观察者模式1.什么是观察者模式WIKI: 一个类(称为主体)持有一组对象的实例(称为观察者),当一些状态变化时主题通常会通过调用观察者的一个方法来通知观察者。2.实例比如说天亮了,大人们出工,小孩去上学3.程序示例观察者的规范public interface IDayObserver { void sunRiseUpdate(); void sunSetUpdate();}public class Kid implements IDayObserver{

观察者模式

1.什么是观察者模式

WIKI: 一个类(称为主体)持有一组对象的实例(称为观察者),当一些状态变化时主题通常会通过调用观察者的
一个方法来通知观察者。

2.实例

比如说天亮了,大人们出工,小孩去上学

3.程序示例

观察者的规范

public interface IDayObserver {

    void sunRiseUpdate();

    void sunSetUpdate();
}
public class Kid implements IDayObserver{
    @Override
    public void sunRiseUpdate() {
        System.out.println("[Kid] 上学");
    }

    @Override
    public void sunSetUpdate() {
        System.out.println("[Kid] 回家");
    }
}
public class Adult implements IDayObserver{

    @Override
    public void sunRiseUpdate() {
        System.out.println("[Adult] 出工");
    }

    @Override
    public void sunSetUpdate() {
        System.out.println("[Adult] 收工");
    }
}
public class Day {

    public enum DayTypeEnum{
        SUN_RISE,
        SUN_SET
    }
    private DayTypeEnum dayType;
    private List<IDayObserver> dayObserverList;

    public Day(){
        dayObserverList = new ArrayList<>();
    }

    public void addObserver(IDayObserver... observer){
        dayObserverList.addAll(Arrays.asList(observer));
    }

    public boolean removeObserver(IDayObserver observer){
       return dayObserverList.remove(observer);
    }

    public void changeDayType(DayTypeEnum dayType){
        if(dayType.equals(this.dayType)) return;
        this.dayType = dayType;
        notifyAllObservers();
    }

    private void notifyAllObservers(){
        switch (dayType){
            case SUN_RISE:
                sunRiseNotify();
                break;
            case SUN_SET:
                sunSetNotify();
                break;
        }
    }

    public void sunRiseNotify(){
        dayObserverList.forEach(IDayObserver::sunRiseUpdate);
    }

    public void sunSetNotify(){
        dayObserverList.forEach(IDayObserver::sunSetUpdate);
    }
}

4.测试

@Test
public void test(){
    Day day = new Day();
    Kid kid = new Kid();
    Adult adult = new Adult();
    day.addObserver(kid, adult);
    day.changeDayType(Day.DayTypeEnum.SUN_RISE);
    day.changeDayType(Day.DayTypeEnum.SUN_SET);        
    day.changeDayType(Day.DayTypeEnum.SUN_RISE);
    day.changeDayType(Day.DayTypeEnum.SUN_SET);
}

5.测试输出

[Kid] 上学
[Adult] 出工
[Kid] 回家
[Adult] 收工
[Kid] 上学
[Adult] 出工
[Kid] 回家
[Adult] 收工

6.总结

当一个状态的变化需要通知到较多的类时,可以定义一个接口让这些类分别实现,然后由主体统一管理这些观察者并在状态变化时发出通知。

本文地址:https://blog.csdn.net/qq_41155089/article/details/112003198

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 门面模式

    门面模式

    老王的股票 大家好,我是小赵,目前任职藏剑山庄高级铸剑师,在山庄里和我玩的比较好的有老王和老刘他们几个,都是组长级别的二货们,经常混在一起打牌。 今... [阅读全文]
  • 设计模式之装饰者模式(三)

    设计模式之装饰者模式(三)

    欢迎大家的持续关注。上一次,我们结合第一篇推导出来的类图,到第二篇根据类图进行实际代码的编写,对装饰者模式有了一个整体的概念以及实战。不知道对你帮助... [阅读全文]
  • 设计模式模式(四):建造者模式(生成器模式)

    建造者模式主要解决问题: 具备若干成员,当其中一个成员发生变化,其它成员也随着发生变化。 这种复杂对象的生成需要使用建造者模式来生成。 建造者设计模... [阅读全文]
  • 设计模式总结(创建型、结构型)

    设计模式总结(创建型、结构型)

    前言 这篇博客主要介绍23种设计模式的适用范围以及他们的优缺点,类图尽量使用了实例的类图来替代,没有找到的类图就用了设计模式本身的结构图。 创建型模... [阅读全文]
  • 23种设计模式之单例模式

    23种设计模式之单例模式

    单例模式的定义 定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的通用类图如下: 单例模式的优缺点 单例模式的优... [阅读全文]
  • 命令模式 Command 行为型 设计模式(十八)

    命令模式 Command 行为型 设计模式(十八)

    命令模式是行为型设计模式,本文对命令模式Command进行了简单介绍,深入的分析了命令模式的意图,以及演化逻辑,并且给出了命令模式的Java版示例,... [阅读全文]
  • 设计模式原来这么简单-观察者模式

    观察者模式1.什么是观察者模式WIKI: 一个类(称为主体)持有一组对象的实例(称为观察者),当一些状态变化时主... [阅读全文]
  • 结合JDK源码看设计模式——组合模式

    前言: 相信大家都打开过层级很多很多的文件夹。如果把第一个文件夹看作是树的根节点的话,下面的子文件夹就可以看作一个子节点。不过最终我们寻找的还是文件... [阅读全文]
  • 设计模式(一)适配器模式与外观模式

    设计模式(一)适配器模式与外观模式

    这两天刚把适配器模式与外观模式学习了一遍,记录一下自己在学习中的思考。 适配器设计模式与外观设计模式所涉及到的一个设计原则: 最少知识原则:不要让太... [阅读全文]
  • 设计模式 - 单例模式(详解)看看和你理解的是否一样?

    一、概述 单例模式是设计模式中相对简单且非常常见的一种设计模式,但是同时也是非常经典的 高频 面试题,相信还是有很多人在面试时会挂在这里。本篇文章主... [阅读全文]
验证码:
Copyright © 2017-2021  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com