首页 > 代码库 > 【面向对象版本】门禁系统

【面向对象版本】门禁系统

项目:门禁系统

一,走出第一步:

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

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

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

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

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

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

(源码)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(" <东湖林语> 门禁系统的使用方法\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("验证失败");
        }
    }
}
Test测试类

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

 

【面向对象版本】门禁系统