一:背景介绍
业务背景
公司老板(米老师)来公司,需要进入办公室的门,这个时候需要一个开门的人。
二:思路&方案
1.面向过程的实现思路
何老师是管理钥匙的人,何老师将钥匙放在了前台。米老师到公司之后需要开门,去前台拿去钥匙并自己去开门
2.面向对象的实现思路一(封装、继承、多态)
有专门管理钥匙的人员,当公司老板(米老师)到公司之后通知一声何老师打开水麒麟的门,何老师听到这个消息之后就过来开门了。
3.面向对象的实现思路二(封装、继承、多态、反射)
有多个老师具备管理钥匙并开门的职责,当米老师到公司之后,通知任意一个老师打开水麒麟的门,被通知的那个老师听到消息之后就过来开门。
三:实现过程
面向过程
将开门整个事都进行了封装,需要开门的人、和开门的人、管理钥匙的人都是明确的。原本何老师的工作(开门)交给了公司老板(米老师)来做
public class Client { public static void main(String[] args) { System.out.println("米老师:我需要开门"); System.out.println("何老师:米老师,钥匙放在前台了,您开一下吧"); System.out.println("米老师:去前台拿钥匙自己去开门了"); } }
2.面向对象(封装)
公司老板(米老师)来公司,需要进入办公室的门,这个时候需要一个开门的人。从这个业务中抽象出四个类来:发消息的人、接收消息的人、业务封装类、客户端类。
建模:
应该为米老师依赖于何老师,米老师需要何老师去开门。
代码编写
接收消息人类
接收消息人类有一个私有的开门方法
public class ReceiveMessager { private void openDoor(){ System.out.println("我是何老师:我来开门了"); } public void receiveMessage( ){ this.openDoor(); } }
发送消息人类
发送消息人类依赖接收消息人类,
public class SendMessager { public void sendMessage(ReceiveMessager receiveMessager){ System.out.println("我是米老师:我需要开门"); receiveMessager.receiveMessage(); } }
业务封装类
封装了一个私有的business()方法,向具体的业务进行封装不进行暴露,暴露给外部一个notice方法。
public class Notice { private void business(){ ReceiveMessager receiveMessager=new ReceiveMessager(); SendMessager sendMessager =new SendMessager(); sendMessager.sendMessage(receiveMessager); } public void notice(){ this.business(); }
客户端
public class Client { public static void main(String[] args) { Notice notice = new Notice(); notice.notice(); }
实现效果
3.面向对象(封装、反射)
在2的基础上添加了反射,这样做的意义是增加灵活性,可以由米老师,通知任何一名具有开门职责的教师去开门。并且是在程序运行期间根据指定的老师,动态实例化。
业务封装类
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 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 Client { public static void main(String[] args) throws Exception { Notice notice = new Notice(); notice.notice(); } }
实现效果
四:总结
面向对象的三大特性是:封装、继承、多态。
面向对象的原则:有七大原则。
面向对象的基础是抽象。
反射的实现方式有三种
1.类对象.class
2.Class.forName(“包路径”)
3.对象.getClass()
面向对象没有好坏之分,只是各自的应用场景不同,根据不同的场景选择合适的开发思想。
面向过程更偏向于小型工程,并且开发速度相对较快,设计相对简单。而面向过程,前期投入的时间相对较多,并且性对难以理解和入门。