目录
- 一:背景介绍
- 业务场景:
- 业务分析:
- 二:实现思路
- 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、面向对象(抽象、封装、消息监听、事件和委托)
面向对象的基础是抽象,我们以开门小例子中为例:可以抽象出四个类,分别是:发消息人类、接收消息人类、业务封装类、客户端类 ,那么我们看看这四个类是如何实现开门小例子的吧~!
建模
共有两种建模方式:
- 米老师依赖何老师
- 何老师依赖米老师
我们以第二种建模方式为例:
代码编写
发消息人类
发消息类中只需有一个发消息的方法
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();
}
}
实现效果
四:总结
面向过程思想
- 以过程为中心的编程思想
- 使用函数实现面向过程的思想
- 主要关注“怎么做”
面向对象思想
- 以对象为基础的编程思想
- 主要关注“谁来做”
封装的好处
- 提高代码的安全性
- 提高代码的复用性
- “高内聚”:封装细节,便于修改内部代码,提高可维护性
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作