面向对象版本门禁系统
Posted 秋天中的一片叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象版本门禁系统相关的知识,希望对你有一定的参考价值。
项目:门禁系统
一,走出第一步:
这是我人生中的第一个小项目。能够最终完成我心里还是非常高兴的。在实现的过程中可谓是百般艰难。
接下来简单说说完成路上的一点个人心得,希望能给到跟我一样是新手的朋友们一点点帮助。
这个项目起初拿到命题后,完全不知道从何入手。只能粗略的从命题中抓取几个关键字。比如说 小区电子门,访客,门卫(管理员),业主,指纹验证,刷卡验证,手机扫码验证等。
然后还可以做到的是,对比它们之间的关系。发现我可以把访客,门卫,业主分为一类放到一个包中,电子门可以放到一个包中,各种验证放到一个包中。再然后。。想来想去,虽然知道接下来要把它们一一的
关系串联起来,但是自己思考过后的逻辑怎么都觉得不对。也不知道应该先写谁,再写谁。于是乎我就百度到处搜索相关的案例。发现有很多不同的版本。对于一个初学者的我而言,一些复杂的代码看也看不懂,
做也不知道为什么这么做。只能挑选一些简单的代码跟拓扑图来进行分析,最终看到下面这位仁兄的代码后决定从他的代码入手,先分析代码内容让自己能够先读的懂。然后再尝试着写出类似他的代码。
(源码)http://blog.csdn.net/mozunx/article/details/41699429#
可以说我的代码99%是抄袭而来的。但是我并不认为抄袭有什么不好。只有抄袭多了,看多了,分析多了时间长了自然也就懂了(个人观点)。懂了就知道为何当初这些设计者要这么去设计了。久而久之自己也能够像他们一样,写出属于自己思考的代码了。
基于上面的因素我把对方的代码添加了我个人理解后的注释,然后再根据相同的原理写了一个自己小区门禁系统的模拟代码。希望高手们多多指点。也希望喷子们口下留德。
二,代码篇
1. com.hudong.sys包
package com.hudong.sys; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; import com.hudong.validate.CardValidate; import com.hudong.validate.FingValidate; import com.hudong.validate.MobilephoneScanVilidate; import com.hudong.validate.Validate; public class Computer { /** * 没有涉及数据库.模拟数据存放到内存中 */ HashMap<Integer, String> CardVid = new HashMap<Integer, String>(); ArrayList<String> FingVid = new ArrayList<String>(); String[] MobilephoneVid = new String[10]; /** * 向集合和数组中添加业主密码数据. 如果想业主跟密码一一匹配最好的办法就是用HashMap来做.因为为了联系各个集合数组的用法.下面只是粗略模拟 */ public Computer() { CardVid.put(0, "ca111"); CardVid.put(1, "ca222"); CardVid.put(2, "ca333"); CardVid.put(3, "ca444"); CardVid.put(4, "ca555"); FingVid.add("fi111"); FingVid.add("fi222"); FingVid.add("fi333"); FingVid.add("fi444"); FingVid.add("fi555"); MobilephoneVid[0] = "sc111"; MobilephoneVid[1] = "sc222"; MobilephoneVid[2] = "sc333"; MobilephoneVid[3] = "sc444"; MobilephoneVid[4] = "sc555"; MobilephoneVid[5] = ""; } public boolean validate(String inputMsg) { boolean ban = false; Scanner input = new Scanner(System.in); System.out.println("请选择验证方式: 1. 卡片验证, 2.指纹验证, 3.手机扫码验证"); int number = input.nextInt(); Validate vali; // 初使化Validate接口 switch (number) { case 1: vali = new CardValidate(); ban = vali.check(CardVid, inputMsg); break; case 2: vali = new FingValidate(); ban = vali.check(FingVid, inputMsg); break; case 3: vali = new MobilephoneScanVilidate(); ban = vali.check(MobilephoneVid, inputMsg); break; default: System.out.println("选择有误,不能超过所给选项!!请确认后重新选择:"); break; } return ban; } }
package com.hudong.sys; /** * 电子门类 * * 2个长量(OPEN,CLOSE),2个私有字段(state,bellState),2个方法(OPEN(),CLOSE()) * @author liupeng * */ public class Door { public final static String CLOSE = "CLOSE"; //关闭小区门状态常量 public final static String OPEN = "OPEN"; //打开小区门状态常量 private String state = "CLOSE"; //小区门关闭状态 private boolean bellState = false; //门铃呼叫管理员 /** * 构造方法 */ public Door() { this.setState(CLOSE); // 默认门关闭 } public Door(String state, boolean bellState) { super(); this.state = state; this.bellState = bellState; } /** * 打开小区电子门和关闭小区电子门方法 */ public void OPEN(){ this.setState(OPEN); } public void CLOSE(){ this.setState(CLOSE); } /** * getter,setter */ public String getState() { return state; } public void setState(String state) { this.state = state; } public boolean isBellState() { return bellState; } public void setBellState(boolean bellState) { this.bellState = bellState; } public static String getClose() { return CLOSE; } public static String getOpen() { return OPEN; } }
2. com.hudong.user包
package com.hudong.user; import java.util.Scanner; import com.hudong.sys.Door; /** * 访客类 1个字段(name),1个方法(pressRing()传入对象为Door实体类). * * @author liupeng * */ public class Guest { private String name; // 访客姓名 /** * 构造方法 */ public Guest() { super(); // TODO Auto-generated constructor stub } public Guest(String name) { super(); this.name = name; } /** * 按门铃方法 * 模拟Guest用户按门铃 * @param door */ public void pressRing(Door door) { Scanner input = new Scanner(System.in); System.out.println("访客 (" + this.getName() + " )按门铃? [y/n] :"); String btn = input.next(); if (btn.equals("y")) { door.setBellState(true); // 调用Door类中setter封装中的.setBellState方法.(因为bellState定义的时候为boolean类型.返回值为true // 或者 false.默认为初始false.) System.out.println("访客(" + this.getName() + ") 按下门铃声!"); } else if (btn.equals("n")) { return; } } // getter,setter public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.hudong.user; import java.util.Scanner; /** * HouseMaster类 * * (1)模拟住户进出小区电子门,身份验证. * (2)HouseMaster继承Guest类 * (3)1个input身份验证方法. * @author liupeng * */ public class HouseMaster extends Guest{ //构造方法 public HouseMaster() { super(); // TODO Auto-generated constructor stub } public HouseMaster(String name) { super(name); // TODO Auto-generated constructor stub } /** * 创建一个身份验证的input方法,方便调用 * @return */ public String input(){ Scanner scanner = new Scanner(System.in); System.out.println("身份验证:"); String Authentication = scanner.nextLine(); return Authentication; } }
package com.hudong.user; import java.util.Scanner; import com.hudong.sys.Door; public class Admin extends HouseMaster { // 构造方法 public Admin() { super(); // TODO Auto-generated constructor stub } public Admin(String name) { super(name); // TODO Auto-generated constructor stub } /** * 模拟管理员通过监控室来开启小区电子门 * * @param door * @return */ public boolean work(Door door) { boolean b = false; Scanner scanner = new Scanner(System.in); System.out.println("门卫 (" + this.getName() + ") 是否按下开门按钮? [y/n]:"); String btn = scanner.next(); if (btn.equalsIgnoreCase("y")) { System.out.println("门卫(" + this.getName() + ")按下开门按钮"); b = true; } else { System.out.println("---门卫(" + this.getName() + ")拒绝开门"); } return b; } /** * 模拟管理员通过监听门铃开启小区电子门 * * @param door * @param guest * @return */ public boolean work(Door door, Guest guest) { boolean bn = false; if (door.isBellState()) { bn = this.work(door); // 调用上面work方法. door.setBellState(false); // 设置铃声为默认状态.默认状态为(false) } return bn; } }
3. com.hudong.validate包
package com.hudong.validate; /** * Validate(验证)接口 * @author liupeng * */ public interface Validate { //创建一个check抽象方法,目的在于check进入小区电子门时,使用的是哪一种认证方式 public abstract boolean check(Object ob, String inputMsg); }
package com.hudong.validate; import java.util.HashMap; /** * 模拟刷卡认证 设定CardValidate的check方法.用2个参数来预备接收数据. * * (1)ob为了接收Computer类中HashMap数据库中的值 (2)inputMsg为了接收键盘输入的值 * * @author liupeng * */ public class CardValidate implements Validate { @Override // 从接口继承,并重写 public boolean check(Object ob, String inputMsg) { boolean ban = false; // 定义一个变量来接收结果 HashMap contacts = (HashMap) ob; // 强类型转换Object ob为HashMap类型 for (int i = 0; i < contacts.size(); i++) { if (contacts.get(i).equals(inputMsg)) { ban = true; break; } } return ban; } }
package com.hudong.validate; import java.util.ArrayList; /** * 模拟指纹认证 设定FingValidate的check方法.用2个参数来预备接收数据. * * (1)ob为了接收Computer类中ArrayList数据库中的值 (2)inputMsg为了接收键盘输入的值 * * @author liupeng * */ public class FingValidate implements Validate { @Override public boolean check(Object ob, String inputMsg) { boolean ban = false; ArrayList list = (ArrayList) ob; for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(inputMsg)) { ban = true; break; } } return ban; } }
package com.hudong.validate; /** * 模拟手机扫码认证(MobilephoneScanVilidate) 设定的check方法.用2个参数来预备接收数据. * * (1)ob为了接收Computer类中数组中的值 (2)inputMsg为了接收键盘输入的值 * * @author liupeng * */ public class MobilephoneScanVilidate implements Validate { @Override public boolean check(Object ob, String inputMsg) { boolean ban = false; String[] result = (String[]) ob; for (int i = 0; i < result.length; i++) { if (result[i].equals(inputMsg)) { ban = true; } else if (result[i].equals("")) { break; } } return ban; } }
4. com.hudong.test包
package com.hudong.test; import java.util.Scanner; import com.hudong.user.*; import com.hudong.user.*; import com.hudong.validate.*; import com.hudong.sys.*; public class Test { public static void main(String[] args) { System.out.println(" <东湖林语> 门禁系统的使用方法\\n" + " 1.模拟手机扫码:以 [ sc ] 开头,后跟手机扫码字符串\\n" + " 2.模拟刷卡:以 [ ca ] 开头,后跟卡号\\n" + " 3.模拟取指纹:以 [ fi ] 开头,后跟表示指纹的字符串\\n" + " 4.模拟管理员按下开门按钮:输入 [ y ]"); System.out .println("***************************************************"); System.out.println("门禁系统启动"); System.out .println("***************************************************"); Scanner in = new Scanner(System.in); Door door = new Door(); boolean ban = true; boolean bn = false; Computer computer = new Computer(); Admin admin = new Admin("老李"); while (ban) { System.out.println("请选择扮演的角色:1.访客 2.门卫 3.业主 其它:结束"); String n = in.next(); switch (Integer.parseInt(n)) { case 1: Guest guest = new Guest("访客1"); guest.pressRing(door); // 按门铃 bn = admin.work(door, guest); // 管理员监听门铃 /* 检查开门信号(监听门铃,响) */ break; case 2: case 3: System.out.println("请输入验证信息:"); bn = computer.validate(in.next()); break; default: ban = false; } if (bn) { door.OPEN(); // 开启电子门 System.out.println("门卫 " + admin.getName() + " 开启了电子门"); System.out.println("^_^ 欢迎光临!"); /* 电子门开启状态将维持5秒后关闭 */ try { Thread.sleep(5000); // 让电子门开启状态维持5秒 } catch (InterruptedException e) { System.out.println(e.getMessage()); } door.CLOSE(); // 关闭电子门 System.out.println("---电子门5秒后自动关闭---"); } else System.out.println("验证失败"); } } }
只要不懈的努力,终会实现梦想!
以上是关于面向对象版本门禁系统的主要内容,如果未能解决你的问题,请参考以下文章
[.net 面向对象程序设计进阶] (25) 团队开发利器分布式版本控制系统Git (上)
[.net 面向对象程序设计进阶] (25) 团队开发利器分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境转