zoukankan      html  css  js  c++  java
  • 【面向对象版本】门禁系统

    项目:门禁系统

    一,走出第一步:

    这是我人生中的第一个小项目。能够最终完成我心里还是非常高兴的。在实现的过程中可谓是百般艰难。

    接下来简单说说完成路上的一点个人心得,希望能给到跟我一样是新手的朋友们一点点帮助。

    这个项目起初拿到命题后,完全不知道从何入手。只能粗略的从命题中抓取几个关键字。比如说 小区电子门,访客,门卫(管理员),业主,指纹验证,刷卡验证,手机扫码验证等。

    然后还可以做到的是,对比它们之间的关系。发现我可以把访客,门卫,业主分为一类放到一个包中,电子门可以放到一个包中,各种验证放到一个包中。再然后。。想来想去,虽然知道接下来要把它们一一的

    关系串联起来,但是自己思考过后的逻辑怎么都觉得不对。也不知道应该先写谁,再写谁。于是乎我就百度到处搜索相关的案例。发现有很多不同的版本。对于一个初学者的我而言,一些复杂的代码看也看不懂,

    做也不知道为什么这么做。只能挑选一些简单的代码跟拓扑图来进行分析,最终看到下面这位仁兄的代码后决定从他的代码入手,先分析代码内容让自己能够先读的懂。然后再尝试着写出类似他的代码。

    (源码)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;
    
        }
    
    }
    Computer类
    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;
        }
        
        
    
    }
    Door类

    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;
        }
    
    }
    Guest访客类
    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;
        }
        
    
    }
    HouseMaster业主类
    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;
        }
    
    }
    Admin门卫类

    3.  com.hudong.validate包

    package com.hudong.validate;
    /**
     * Validate(验证)接口
     * @author liupeng
     *
     */
    public interface Validate {
        //创建一个check抽象方法,目的在于check进入小区电子门时,使用的是哪一种认证方式
        public abstract boolean check(Object ob, String inputMsg);  
    
    }
    Validate接口
    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;
        }
    
    }
    CardVid刷卡验证类
    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;
        }
    
    }
    FingValidate指纹验证类
    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;
        }
    
    }
    MobilePhoneValidate手机扫码验证类

    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(" <东湖林语> 门禁系统的使用方法
    "
                    + " 1.模拟手机扫码:以 [ sc ] 开头,后跟手机扫码字符串
    "
                    + " 2.模拟刷卡:以 [ ca ] 开头,后跟卡号
    "
                    + " 3.模拟取指纹:以 [ fi ] 开头,后跟表示指纹的字符串
    " + " 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("验证失败");
            }
        }
    }
    Test测试类

    只要不懈的努力,终会实现梦想!

  • 相关阅读:
    Maven pom.xml中添加指定的中央仓库
    命令行远程链接MySQL
    A required class was missing while executing org.apache.maven.plugins:maven-war-plugin:2.1.1:war
    mvn deploy命令上传包
    保存好你的密码
    PuTTY免输密码自动登录Linux
    ActiveMQ无法启动
    linux控制台批量杀进程
    dubbo入门之微服务客户端服务端配置
    dubbo入门之helloWorld
  • 原文地址:https://www.cnblogs.com/liupengpengg/p/6349353.html
Copyright © 2011-2022 走看看