一.案例背景
1.一个现实中常见的业务场景:米老师需要进入办公室,需要何老师帮忙开门,或者说需要一个开门的人。
2.面向过程的思路:何老师告诉米老师钥匙在哪里,然后米老师去取了钥匙,最后去开门
3.面向对象思路
对于这个业务场景进行抽象的话,可以抽象出四个类:发消息人类、收消息人类、业务处理类、客户端。
米老师只要喊一句开门,就有人过来把门打开了
二.案例启发
由此可以看出,面向过程的思路只是解决当前的问题,会被当前的地点,当前的人所局限,而面向对象的思路,则可以在此基础上复用,拓展,正所谓:
1.我们注重的是谁来干事,而不是怎么干事
2.我们注重的是有多少人干事,而不是干多少事
三.面向对象代码实现
1.利用抽象、封装、消息监听、事件和委托的形式,抽象出来的四个类分别是:发消息人类、收消息人类、业务处理类、客户端。
sendMessage发消息人类
package com.opendoor; public class sendMessage { public void sendMessage(){ System.out.println("我是米老老师,我需要开门"); } }
receiveMessage接收消息的人类
package com.opendoor; public class receiveMessage { private void openDoor(){ System.out.println("我是何老师,我来开门了"); } public void receiveMessage(sendMessage teacherMi){ teacherMi.sendMessage(); this.openDoor(); } }
Notice业务处理类
package com.opendoor; public class Notice { private void business(){ receiveMessage teacherHe =new receiveMessage(); teacherHe.receiveMessage(new sendMessage()); } public void notice(){ this.business(); } }
Client客户端类
package com.opendoor; public class Client { public static void main(String[] args) { // write your code here Notice notice=new Notice(); notice.notice(); } }
2.面向对象加入反射的形式(不再被人所局限,更加灵活),同样抽象出四个类
sendMessage发消息人类
package com.opendoorReflect; import java.lang.reflect.Method; //发消息人类 public class sendMessage { 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); } }
receiveMessage接收消息的人类
package com.opendoorReflect; //接收消息人类 public class receiveMessage { private void openDoor(){ System.out.println("接收消息的人:好的,已开门"); } public void receiveMessage(){ this.openDoor(); } }
Notice业务处理类
package com.opendoorReflect; import java.util.Scanner; public class Notice { private void business(String className,String methodName) throws Exception{ sendMessage sendMessage = new sendMessage(); sendMessage.sendMessage(className, methodName); } private void getParam() throws Exception{ //通过new Scanner(System.in)创建一个Scnner类型的名叫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(); } }
Client客户端类
package com.opendoorReflect; public class Client { public static void main(String[] args) throws Exception { Notice notice=new Notice(); notice.notice(); } }