当前位置: 首页 > news >正文

设计模式 人类父母和猫孩子的关系理解观察者模式(发布订阅模式)

目录

1 观察者模式介绍

2 案例应用


1 观察者模式介绍

属于对象行为模式。

又叫 发布-订阅模式、模型-视图模式

多个对象间存在一对多的依赖关系,当一个对象状态发生改变时,其相关依赖对象皆得到通知,并被自动更新。


在观察者模式中参演的两个角色分别是观察者和被观察者。

 主要优点:

1 降低了目标与观察者之间的耦合关系。两者之间是抽象耦合关系,符合依赖倒置原则。
2 目标与观察者之间建立了一套触发机制。

注意:

具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,违反了面向对象的设计原则。

适用场景:

许多对象不是独立存在的,其中一个对象的行为改变可能会导致一个或者多个其他对象的行为也发生改变时。

2 案例应用

比如我有两个孩子(两只猫),一个是哥哥,一个是妹妹,猫是会观察人类的表情来做出行为反应的。当观察到人类开心时,他就可以撒欢跑跳,当观察到人类的表情不开心时,他也会有所收敛。

这里的观察者就是两只猫,被观察者比如是他们的妈妈。一个妈妈的心情会导致多只猫不同的行为发生变化,这种情况,就可以使用观察者模式。

因为妈妈的表情会影响到孩子的行为,所以可以把妈妈的表情理解为一种通知。

观察者: 哥哥和妹妹 (多)
被观察者: 妈妈  (一) 

被观察者 通知 观察者

 观察者 孩子(两只猫)

package com.qing.observe;

//观察者
public abstract class Child {
    abstract void response(String mood);
}

package com.qing.observe;

//观察者1
public class Brother extends Child {
    @Override
    void response(String mood) {
        if("好心情".equals(mood)){
            System.out.println("哥哥 撒欢玩");
        }else{
            System.out.println("哥哥 乖乖地,不闹事");
        }
    }
}

package com.qing.observe;

//观察者2
public class Sister extends Child {
    @Override
    void response(String mood) {
        if("好心情".equals(mood)){
            System.out.println("妹妹 要抱抱");
        }else{
            System.out.println("妹妹 保持乖巧");
        }
    }
}

被观察者 父母,里面有成员变量 孩子

package com.qing.observe;

import java.util.ArrayList;
import java.util.List;

//被观察者
public abstract class Parent {
    List<Child> children = new ArrayList<Child>();

    //添加观察者
    public void add(Child child){
        children.add(child);
    }

    //删除观察者
    public void remove(Child child){
        children.remove(child);
    }


    public abstract void showFace(String mood);
}

 妈妈的表情会通知孩子做出反应

package com.qing.observe;

//被观察者:妈妈
public class Mother extends Parent {

    //做出反应
    @Override
    public void showFace(String mood) {
        for (Child child:children) {
            //根据妈妈脸上显示的心情,孩子做出反应
            child.response(mood);
        }
    }
}

测试

package com.qing.observe;

public class Test1 {
    public static void main(String[] args) {
        Parent mother = new Mother();
        Child brother = new Brother();
        Child sister = new Sister();
        mother.add(brother);
        mother.add(sister);
        mother.showFace("好心情");
        System.out.println("---------------");
        mother.showFace("气炸了");
    }
}

结果

相关文章:

  • 【java核心技术】Java知识总结 -- 语法篇
  • Neo4j图数据库和GDS图算法应用
  • Hello, World
  • 蒋鑫鸿:9.10国际黄金原油最新外盘行情趋势点评附解一套技术指导
  • gem5 GPGPU-Sim 安装踩坑笔记
  • 【Linux私房菜】—— 远程登录与数据传输、Vim与Vi的基础用法、关机与重启、登录与注销、运行级别、root密码找回
  • JSR-133: JavaTM Memory Model and Thread Specification原文解析
  • html网页如何获取后台数据库的数据(html + ajax + php + mysql)
  • Spring之事务实现原理及其注解@Transactional底层和传播机制原理
  • 第14章: 集合
  • Java后端开发工程师学习笔记【狂神说Java笔记】
  • Linux上的中文输入法安装(Ubuntu + Kali五笔拼音)
  • java+php+python的公文审批系统-办公系统
  • 使用C语言+USRP B210从零开始实现无线通信(4) 接收检测与解调
  • Spark系列从入门到精通(二)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • bootstrap创建登录注册页面
  • Git 使用集
  • Git初体验
  • IOS评论框不贴底(ios12新bug)
  • jquery cookie
  • Laravel Telescope:优雅的应用调试工具
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Python3爬取英雄联盟英雄皮肤大图
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Theano - 导数
  • vue.js框架原理浅析
  • 从零搭建Koa2 Server
  • 工作中总结前端开发流程--vue项目
  • 技术发展面试
  • 温故知新之javascript面向对象
  • 我的zsh配置, 2019最新方案
  • 一道闭包题引发的思考
  • 云大使推广中的常见热门问题
  • MPAndroidChart 教程:Y轴 YAxis
  • 阿里云ACE认证之理解CDN技术
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Spring-boot高级
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (九)One-Wire总线-DS18B20
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一) storm的集群安装与配置
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Linq学习笔记
  • (转)用.Net的File控件上传文件的解决方案
  • (轉貼) UML中文FAQ (OO) (UML)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全