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

【教学典型案例】18.开门小例子理解面向对象

目录

  • 一:背景介绍
    • 业务场景:
    • 业务分析:
  • 二:实现思路
    • 1、面向过程:
    • 2、面向对象(抽象、封装、继承、多态)
    • 3、面向对象(抽象、封装、继承、多态、反射)
  • 三:实现过程
    • 1、面向过程:
      • 代码编写
      • 实现效果
    • 2、面向对象(抽象、封装、消息监听、事件和委托)
      • 建模
      • 代码编写
        • 发消息人类
        • 接收信息人类
        • 业务封装类
        • 客户端类
      • 实现效果
    • 3、面向对象(抽象、封装、消息监听、反射)
      • 代码编写
        • 发送消息人类
        • 接收消息人类
        • 业务封装类
        • 客户端类
      • 实现效果
  • 四:总结
      • 面向过程思想
      • 面向对象思想
      • 封装的好处

一:背景介绍

业务场景:

米老师来壹佰八楼,需要进入办公室的门,这时需要一个开门的人

业务分析:

根据业务场景,抽象出了四个类:发消息人类、接收信息人类、业务封装类、客户端
在这里插入图片描述

二:实现思路

1、面向过程:

何老师告诉米老师要是在哪儿,然后米老师到壹佰之后去拿上钥匙开门

2、面向对象(抽象、封装、继承、多态)

何老师管钥匙开门,这个前提米老师是知道的。当米老师到壹佰之后喊一声何老师打开水麒麟的门,何老师听到消息之后就过来开门了

3、面向对象(抽象、封装、继承、多态、反射)

有多个老师管钥匙开门,这个前提米老师是知道的。当米老师到壹佰之后喊一声任意一个老师打开水麒麟的门,被喊到的那个老师听到消息之后就过来开门了

三:实现过程

1、面向过程:

代码编写

public class Client {public static void main(String[] args) {System.out.println("我是米老师,我需要开门");System.out.println("好的,米老师,我马上给您开门");}
}

实现效果

在这里插入图片描述

2、面向对象(抽象、封装、消息监听、事件和委托)

面向对象的基础是抽象,我们以开门小例子中为例:可以抽象出四个类,分别是:发消息人类、接收消息人类、业务封装类、客户端类 ,那么我们看看这四个类是如何实现开门小例子的吧~!

建模

共有两种建模方式:

  1. 米老师依赖何老师
  2. 何老师依赖米老师

我们以第二种建模方式为例:
在这里插入图片描述

代码编写

发消息人类

发消息类中只需有一个发消息的方法

public class sendMessager {public void sendMessage(){System.out.println("我是米老师:我需要开门");}
}

接收信息人类

接收信息类中有一个私有的开门方法,还有一个公有的接收信息方法,因为是接收信息人类依赖发消息人类,所以把teacherMi当作参数传给了receiveMessage(sendMessager techerMi),然后使用teacherMi调用teacherMi自己的发消息方法sendMessage()

public class receiveMessager {private void openDoor(){System.out.println("我是何老师:我来开门了");}public void receiveMessage(sendMessager teacherMi){teacherMi.sendMessage();this.openDoor();}
}

业务封装类

写了一个私有的business()方法,进行封装。实例化了接收消息人类,让接收信息人调用自己的接收信息方法receiveMessage(),然后把发送信息人类当作参数传入receiveMessage(new sendMessager())。
接着在写一个公有的notice()方法,来调用已经封装好的business()方法,供其他类使用

public class Notice {private void business(){receiveMessager teacherHe = new receiveMessager();teacherHe.receiveMessage(new sendMessager());}public void notice(){this.business();}
}

客户端类

在main()方法里实例化了业务封装类Notice类,然后使用实例化好的notice来调用自己暴露在外的notice()方法

public class Client {public static void main(String[] args) {Notice notice = new Notice();notice.notice();}
}

实现效果

在这里插入图片描述

3、面向对象(抽象、封装、消息监听、反射)

代码编写

发送消息人类

public class SendMessager {public void sendMessage(String className,String methodName) throws Exception{System.out.println("米老师发消息======");//通过反射获取对象和方法Class classObj = Class.forName(className);Object teacherHe = classObj.newInstance();Method methodObj = classObj.getMethod(methodName);methodObj.invoke(teacherHe,null);}
}

接收消息人类

public class ReceiveMessager {private void openDoor(){System.out.println("接收消息的人:好的,已开门");}public void receiveMessage(){this.openDoor();}
}

业务封装类

public class Notice {private void business(String className,String methodName) throws Exception{SendMessager sendMessager = new SendMessager();sendMessager.sendMessage(className, methodName);}private void getParam() throws  Exception{//通过new Scanner(System.in)创建一个Scanner类型的名叫scanner的对象,//控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给scannerScanner scanner = new Scanner(System.in);System.out.println("请输入类名");//nextLine()方法的作用时获取当前行的输入内容,//返回得到的是回车键之前的所有字符,包括空格String className = scanner.nextLine();System.out.println("请输入方法名");String methodName = scanner.nextLine();this.business(className, methodName);}public void notice() throws Exception{this.getParam();}
}

客户端类

public class Client {public static void main(String[] args) throws Exception {Notice notice = new Notice();notice.notice();}
}

实现效果

在这里插入图片描述

四:总结

面向过程思想

  1. 以过程为中心的编程思想
  2. 使用函数实现面向过程的思想
  3. 主要关注“怎么做”

面向对象思想

  1. 以对象为基础的编程思想
  2. 主要关注“谁来做”

封装的好处

  1. 提高代码的安全性
  2. 提高代码的复用性
  3. “高内聚”:封装细节,便于修改内部代码,提高可维护性
  4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作

相关文章:

【教学典型案例】18.开门小例子理解面向对象

目录一:背景介绍业务场景:业务分析:二:实现思路1、面向过程:2、面向对象(抽象、封装、继承、多态)3、面向对象(抽象、封装、继承、多态、反射)三:实现过程1、…...

Linux环境ENV的概念

一、基本概念 环境变量的含义:程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。 按变量的周期划为永久变量和临时性变量2种: 永久变量:通过修改配置文件&#xff0c…...

AcWing数据结构 - 数据结构在算法比赛中的应用(下)

目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路: 设 idx索引用于构建树, 结点son[节点位置][节点分支指针],cnt[]记录单…...

基于嵌入式libxml2的ARM64平台的移植(aarch64)

由于libxml在移植过程中依赖于zlib的库文件,因此本节内容包含zlib(V1.2.13)的移植libxml2(V2.10.3)的移植两部分组成。 (一)zlib的移植(基于arm64) 1、在github上下载zlib的最新源码压缩包&am…...

8. 字符串转换整数 (atoi)

题目描述 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&#x…...

[Tomcat]解决IDEA中的Tomcat中文乱码问题

目录 1、IDEA 2、VM options 3、IDEA启动程序的存放目录 4、Tomcat 写在前面:此方法亲测有效!!! 1、IDEA 2、VM options 加上这两行: -Dfile.encodingUTF-8 -Dconsole.encodingUTF-8 3、IDEA启动程序的存放目录…...

python之dataclasses

一、场景 dataclasses模块提供了一种方便的方法来创建和管理数据对象 它可以帮助开发者更容易地创建简单的类,同时提供了一些实用的功能,例如自动实现__init__()、repr()、eq()等方法。 数据容器:如果您需要一个简单的类来存储一些数据&…...

【MapGIS精品教程】007:MapGIS投影变换案例教程

MapGIS投影变换,包括创建坐标系、定义投影、单点投影、类投影、批量投影。 文章目录 一、创建坐标系1. 创建高斯平面坐标系2. 创建阿尔伯斯投影二、定义投影三、投影变换1. 单点投影2. 类投影3. 批量投影一、创建坐标系 在MagGIS数据库中,有个空间参考系的文件夹,内置了常见…...

list数据根据属性字段去重

/*** 根据照片名称去重*/fun duplicateRemoval(list: MutableList<MediaBean>): MutableList<MediaBean>? {val mediaBeanList: MutableSet<MediaBean> if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {TreeSet(Comparator.comparing(MediaBean::f…...

java教程(2023-3-8)

第一章&#xff1a;HelloWorld 1.java语言介绍 public class MainTest {public static void main(String[] args) { //软件分为系统软件和应用软件 //人机交互方式&#xff1a; 图形化界面 命令行方式/*常用的DOS命令&#xff1a;1.切换盘符&#xff1a;盘符 :2.创建文件夹m…...

node 配置 vue npm配置

下载node 版本16https://nodejs.org/download/release/v16.16.0/node-v16.16.0-x64.msi复制安装地址&#xff0c;省空间&#xff0c;生报错老老实实复制就好D:\Program\nodejs新建node_cache和node_globalD:\Program\nodejs\node_cacheD:\Program\nodejs\node_global运行命令np…...

特斯拉、小鹏开路,城市NOA距好用还有几年?

作者 | Marshall 编辑 | 张祥威一项新技术&#xff0c;狂热的技术开发者往往会高估其发展速度&#xff0c;认为当下偶尔发生的安全问题&#xff0c;会随着数据积累和功能迭代被逐渐解决。 他们往往会说&#xff0c;“这个问题没有包含在我们的场景库中&#xff0c;但现在我们知…...

Vue 3第九章:WatchEffect高级侦听器

文章目录1. WatchEffect高级侦听器1.1. 使用 watchEffect 函数1.2. 停止侦听1.3. 侦听多个状态1.4. 懒执行总结1. WatchEffect高级侦听器 在 Vue 3 中&#xff0c;我们可以使用 watchEffect 函数来创建高级侦听器。与 watch 和 computed 不同&#xff0c;watchEffect 不需要指…...

c++基础——函数

函数的声明编程中的函数&#xff08;function&#xff09;一般是若干语句的集合。我们也可以将其称作“子过程&#xff08;subroutine&#xff09;”。在编程中&#xff0c;如果有一些重复的过程&#xff0c;我们可以将其提取出来&#xff0c;形成一个函数。函数可以接收若干值…...

DPDK系列之七DPDK中的虚拟化支持

一、DPDK和虚拟化 DPDK中大幅优化了网络通信的效率&#xff0c;这里也重点对网卡的虚拟化进行分析。在前面的文章中的学习可以判定网卡基本属于IO虚拟化。但是&#xff0c;虚拟化又有IO全虚拟化和IO半虚拟化之分&#xff0c;那么在DPDK中使用的哪种呢&#xff1f;IO虚拟化一般…...

设计模式~桥接模式(bridge)-14

目录 (1)优点&#xff1a; (2)缺点&#xff1a; (3)使用场景&#xff1a; (4)注意事项&#xff1a; (5)应用实例&#xff1a; 代码 桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&a…...

Java项目3 电子邮件

文章目录发电子邮件发电子邮件 RequestMapping("/sendmail")ResponseBodypublic String sendMail(Email email, HttpServletRequest request,HttpServletResponse response){HttpSession session request.getSession();SimpleMailMessage message new SimpleMailMe…...

设计模式~访问者模式(Visitor)-15

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接受…...

实战小项目之视频监控(1-1)

实战小项目之视频监控&#xff08;1-1&#xff09; 目前常见的视频监控和视频直播都是使用了 RTMP 和 RTSP 流媒体传输协议等。 RTSP&#xff08;Real-Time Stream Protocol&#xff09;由 Real Networks 和 Netscape 共同提出的&#xff0c;基于文本的多媒体播放 控制协议。…...

DEJA_VU3D - Cesium功能集 之 103-直角箭头(标绘+编辑)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码,…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...