当前位置: 首页 > 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的源代码,…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

CTF show Web 红包题第六弹

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

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...