门禁系统的面向对象设计
问题描述 某公司安装了电子门,要设计门禁系统: 公司的雇员可以凭借密码、胸卡或指纹进入公司 计算机根据雇员的验证方式对其身份进行验证 管理员在监控室可以通过按钮直接开启电子门 访客可以按门铃请求进入,由管理员为其放行 管理员可以为新职员设置密码 讲解思路: 1、先根据上面的需求说明业务。然后分析业务,指出3种验证方式都由键盘输入,为了区分,密码以“pa”开头,后跟密码;指纹以“fi”开头,后跟表示指纹的字符串;刷卡以“ca”开头,后跟卡号。 2、根据学员对业务的理解情况,可以演示完成的门禁系统。
问题分析-1 根据需求分析对象 门禁系统、电子门、计算机、输入设备 管理员、 雇员、 访客 验证接口、验证实现
问题分析-2 对象关系 门禁系统包含:电子门、输入设备、计算机 访客 验证接口 extends implements 默认实现 雇员 密码验证 指纹识别 胸卡验证 管理员
难点分析-1 门禁系统类:ControlSys 包含属性:电子门对象、计算机对象、输入设备对象、门铃、开门信号、日志对象 包含方法:工作方法 private Door door; // 门禁系统的电子门 private Computer computer; // 门禁系统的计算机 private InputEquip inputEquip; // 门禁系统的输入设备 private int ring; // 门铃,0为安静,1为鸣响 private int openSign; // 开门信号,由管理员按下按钮时产生 private Logger logger; // 日志 public void work()
难点分析-2 门禁系统工作分3步: 第一步:检查输入设备的输入缓存 第二步:检查开门信号 第三步:电子门开启状态维持5秒后关闭电子门 如果有输入且输入信息存在,开启电子门 输入是否正确由计算机类调用验证接口的相关方法判断 如果收到开门信号,开启电子门 //如果电子门已开启,维持5秒,关闭电子门 java.lang.Thread.sleep(5000); // 程序暂停5000毫秒
难点分析-3 输入设备类模拟输入各种验证信息: 密码、胸卡、指纹都以字符串形式从控制台输入: 输入的验证信息保存在输入设备的缓存中 1、密码以“pa”开头 2、胸卡以“ca”开头 3、指纹以“fi”开头 输入的验证信息保存在输入设备的缓存中 门禁系统保存的验证信息不以上述字符开头 验证时使用String类的方法解析字符串 private String input = null; // 输入设备缓存 java.lang.String.substring( int beginIndex, int endIndex ) java.lang.String.substring( int beginIndex )
难点分析-4 用户级别 访客 只能按门铃 extends 雇员 可以输入验证信息 extends 管理员 可以直接开启电子门,监控门铃
难点分析-5 验证 验证接口定义验证方法 编写默认的实现类:GenericValidate 具体的验证类继承默认的实现类 public boolean check(); // 定义验证方法 private Object[] inner; // 系统保存的身份信息 private Object input; // 需要验证的身份信息 public class PassWordVld extends GenericValidate public class FingerMarkVld extends GenericValidate public class CardVld extends GenericValidate
阶段划分 第一阶段(25分钟) 第二阶段(45分钟) 第三阶段(45分钟) 第四阶段(25分钟) 第五阶段(35分钟) 第六阶段(15分钟) 编写类:电子门、输入设备 第二阶段(45分钟) 编写类:计算机、门禁系统 第三阶段(45分钟) 编写类:访客、雇员、管理员 第四阶段(25分钟) 编写类:验证接口、默认实现 第五阶段(35分钟) 编写类:密码验证、指纹验证、胸卡验证 第六阶段(15分钟) 编写类:测试雇员通过电子门 第七阶段(30分钟) 编写类:测试访客按门铃、管理员开启电子门
第一阶段 第一阶段(25分钟) 要求学员自己动手完成,教员巡视,解答学员提出的问题 利用Eclipse创建工程、项目所需包 编写类:电子门、输入设备 要求学员自己动手完成,教员巡视,解答学员提出的问题
阶段检查 针对第一阶段抽查学员的操作结果 教员给出点评
第一阶段标准代码演示 创建工程和包 编写类:电子门类 Door.java 编写类:输入设备类 InputEquip.java sys包:放置门禁系统相关类 user包:放置访客、雇员、管理员类 validate包:放置验证身份的接口及其实现类 test包:放置测试类 编写类:电子门类 Door.java 编写类:输入设备类 InputEquip.java
第二阶段 第二阶段(45分钟) 编写类 :计算机、门禁系统 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第二阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解 教员给出点评或集中演示难点部分
第二阶段标准代码演示 计算机类: Computer.java 门禁系统类: ControlSys.java
第三阶段 第三阶段(45分钟) 编写类:访客、雇员、管理员 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第三阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解 教员给出点评或集中演示难点部分
第三阶段标准代码演示 访客类:Guest.java 雇员类:Employee.java 管理员:Admin.java
第四阶段 第四阶段(25分钟) 编写类:验证接口、默认实现 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第四阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果 教员给出点评
第四阶段标准代码演示 验证接口 : Validate.java 默认实现:GenericValidate.java private Object[] inner; private Object input; /** * 比较方法的默认的实现,判断输入信息是否存在 * @return 比较结果 */ public boolean check() { for( int i=0; i<this.getInner().length; i++ ) { if( this.getInput()!=null && this.getInput().equals(this.getInner()[i]) ) { return true; } return false;
第五阶段 第五阶段(35分钟) 编写类:密码验证、指纹验证、胸卡验证 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第五阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果 教员给出点评
第五阶段标准代码演示 密码验证: PassWordVld.java 胸卡验证: CardVld.java 指纹验证: FingerMarkVld.java
第六阶段 第六阶段(15分钟) 编写类:测试雇员通过电子门 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第六阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果 教员给出点评
第六阶段标准代码演示 测试雇员通过电子门:EmployeeTest.java public class EmployeeTest { public static void main(String[] args){ Employee employee = new Employee("雇员a"); // 管理员 ControlSys controlSys = new ControlSys(); // 门禁系统 System.out.println("门禁系统---雇员测试"); System.out.println("***************************************************"); while(true){ employee.input(controlSys); controlSys.work(); }
第七阶段 第七阶段(30分钟) 编写类:测试访客按门铃、管理员开启电子门 要求学员自己动手编写,教员巡视,解答学员提出的问题
阶段检查 针对第七阶段抽查学员的编码结果 抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果 教员给出点评
第七阶段标准代码演示 测试访客:GuestTest.java 测试管理员:AdminTest.java public class AdminTest { public static void main(String[] args){ Admin admin = new Admin("王哲"); // 管理员 ControlSys controlSys = new ControlSys(); // 门禁系统 System.out.println("门禁系统---管理员测试"); System.out.println("***************************************************"); while(true){ admin.work(controlSys); controlSys.work(); } public class GuestTest { public static void main(String[] args){ Guest guest = new Guest("赵强"); // 访客员 Admin admin = new Admin("王石头"); // 管理员 ControlSys controlSys = new ControlSys(); // 门禁系统 System.out.println("门禁系统---访客测试"); System.out.println("***************************************************"); while(true){ guest.pressRing(controlSys); admin.work(controlSys, guest); controlSys.work(); }
总结 巩固知识点: 面向对象的特性:封装、继承、多态 常量:必需的关键字 -- final 接口:定义接口、实现接口 异常处理:try/catch/finally log4j:输出保存日志信息