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

news2025/1/23 21:17:46

目录

  • 一:背景介绍
    • 业务场景:
    • 业务分析:
  • 二:实现思路
    • 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的对象,
        //控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给scanner
        Scanner 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. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Istio 中使用 SkyWalking 进行分布式追踪

在云原生应用中,一次请求往往需要经过一系列的 API 或后台服务处理才能完成,这些服务有些是并行的,有些是串行的,而且位于不同的平台或节点。那么如何确定一次调用的经过的服务路径和节点以帮助我们进行问题排查?这时候…

二极管损坏的原因有哪些?

大家好,我是记得诚。 最近项目上肖特基二极管出问题了,概率性损坏,二极管本来是一个很简单的器件,这次重新整理一下,供大家参考。 二极管损坏,个人总结有如下几种情况。 1、过压 在Ta=25℃下,超过二极管的最大反向电压VR,二极管可能会被击穿,导致损坏。 2、过流 …

SpringBoot的基本概念和使用

文章目录一、什么是SpringBoot二、Spring Boot优点三、Spring Boot项目创建四、Spring Boot 配置文件1. yml语法2.properties与yml关系3.多系统的配置五、Spring Boot日志文件1.日志对象2.日志级别日志级别的设置System.out.println VS 日志的两个致命缺点3.日志持久化4.更简单…

[ 常用工具篇 ] windows安装phpStudy_v8.1_X64

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

如何实现大文件断点续传、秒传

大家先来了解一下几个概念: 「文件分块」:将大文件拆分成小文件,将小文件上传\下载,最后再将小文件组装成大文件; 「断点续传」:在文件分块的基础上,将每个小文件采用单独的线程进行上传\下载&…

CobaltStrike密码爆破、伪造上线以及DDos——csIntruder

Git仓库: https://github.com/ljy1058318852/csIntruder0x01 概述 本项目包含CobaltStrike密码爆破、伪造上线以及DDos功能。其中伪造上线支持常见魔改版CS。 This project includes CobaltStrike password blasting, fake online and DDos functions. Among them…

云计算创新展望-精耕细作的超级云计算平台

前言在当今云计算深入各行业、计算量暴增现状之下,云计算生态迎来百花齐放。但用户不希望将所有鸡蛋放在一个篮子里面,因此每个企业都在发展自己的私有云、公有云等多云、混合云结构。因云计算的高灵活性、可扩展性、高性价比,在本地10台服务…

ubuntu的快速安装与配置

文章目录前言一、快速安装二 、基础配置1 Sudo免密码2 ubuntu20.04 pip更新源3 安装和配置oneapi(infort/mpi/mkl) apt下载第一次下载的要建立apt源apt下载(infort/mpi/mkl)4 安装一些依赖库等5 卸载WSLpython总结前言 win11系统 ubuntu20.04 提示:以下…

【力扣-10天SQL入门】5~8天刷题 知识点总结

https://leetcode.cn/study-plan/sql/?progressjgmzq5s第5天 合并175. 组合两个表就是一个简单的left join1581. 进店却未进行过交易的顾客Q:两个表Visits(有visit_id和customer_id两列)和Transactions(有transaction_id、visit_…

Go垃圾回收原理

术语介绍 赋值器:说白了就是你写的程序代码,在程序的执行过程中,可能会改变对象的引用关系,或者创建新的引用。 回收器:垃圾回收器的责任就是去干掉那些程序中不再被引用得对象。 STW:全称是stop the word,GC期间某个阶段会停止…

插值多项式的龙格现象的介绍与模拟

在文章拉格朗日插值多项式的原理介绍及其应用中,笔者介绍了如何使用拉格朗日插值多项式来拟合任意数据点集。   事实上,插值多项式会更倾向于某些形状。德国数学家卡尔龙格Carl Runge发现,插值多项式在差值区间的端点附近会发生扭动&#x…

一篇文章彻底理解setState是同步还是异步!

本文内容均针对于18.x以下版本setState 到底是同步还是异步?很多人可能都有这种经历,面试的时候面试官给了你一段代码,让你说出输出的内容,比如这样:constructor(props) {super(props);this.state {data: data} }comp…

Sentinel架构篇 - 来源访问控制

来源访问控制(黑白名单) 概念 Sentinel 提供了黑白名单限制资源能否通过的功能。如果配置了白名单,则只有位于白名单的请求来源的对应的请求才能通过;如果配置了黑名单,则位于黑名单的请求来源对应的请求不能通过。 …

图形报表ECharts

图形报表ECharts1 图形报表ECharts1.1 ECharts简介-富客户端图表库ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏…

【3.8】操作系统内存管理、Redis数据结构、哈希表

内存满了,会发生什么? 当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中…

MySQL索引15连问,抗住!

1. 索引是什么?索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。索引一般存储在磁盘的文件中,它是占用物理空间的。正所谓水能载舟,也能覆舟。适当的索引能提高查询效率&#x…

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

实战小项目之视频监控(1-2) Nginx 移植 前面也给大家提到了,我们可以使用 Nginx 来搭建 RTMP 流媒体服务器,譬如你可以在一台公网 IP 主 机上搭建流媒体服务器,当然,笔者并没有这个条件;这里我…

2023年计算语言学和自然语言处理国际会议(CLNLP 2023)

2023年计算语言学和自然语言处理国际会议(CLNLP 2023) 重要信息 会议网址:www.clnlp.org 会议时间:2023年8月18-20日 召开地点:中国南京 截稿时间:2023年6月31日 录用通知:投稿后2周内 收…

MATLAB绘制三Y轴坐标图:补充坐标轴及字体设置

三轴坐标图 1 函数 MATLAB绘制三轴图函数可见MATLAB帮助-multiplotyyy 基础图形绘制是很简单,但坐标轴及字体设置该如何实现呢? 本文以以下几个例子为例,希望可以解决在利用MATLAB绘制三轴坐标图时常见的疑惑。 2 案例 2.1 案例1&#xf…

大数据框架之Hive:第6章 查询

第6章 查询 6.1 基础语法 1)官网地址 https://cwiki.apache.org/confluence/display/Hive/LanguageManualSelect 2)查询语句语法: SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_reference -- 从什么表查[WHE…