📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题22(1)

📅  最后修改于: 2023-12-03 15:28:46.411000             🧑  作者: Mango

门| Sudo GATE 2020 Mock II(2019年1月10日)|问题22

问题描述:

某公司的安保系统需要设计一个门禁系统。门禁系统需要实现以下功能:

  • 系统需要知道进入或者离开公司的员工ID和时间
  • 系统需要能够记录每一个员工的进入时间和离开时间
  • 系统需要能够查询某个员工的所有出入记录

设计一个面向对象的门禁系统,满足以上需求。

解答:

我们可以设计一个门禁系统具有以下对象:

  • Employee:员工对象,包含员工ID,进入时间和离开时间,以及相应的getter和setter方法。
  • SecuritySystem:安保系统对象,包含进入记录和离开记录,以及相应的方法实现。其中,SecuritySystem中的记录为一个(Employee, 时间)的二元组。
  • Door:门的对象,包含进入门和离开门,以及相应的进出门的方法实现。

Python实现代码如下:

首先是 Employee 类:

class Employee:
    def __init__(self, employee_id):
        self.employee_id = employee_id
        self.enter_time = None
        self.leave_time = None
        
    def get_employee_id(self):
        return self.employee_id
    
    def set_enter_time(self, time):
        self.enter_time = time
        
    def get_enter_time(self):
        return self.enter_time
    
    def set_leave_time(self, time):
        self.leave_time = time
        
    def get_leave_time(self):
        return self.leave_time

Employee 类中,我们定义了员工对象,包含员工ID,进入时间和离开时间,以及相应的getter和setter方法。这里的进入时间和离开时间采用了None作为默认值,因为员工进入和离开时间不存在的情况下我们需要可以修改它的状态。

接下来是 SecuritySystem 类:

class SecuritySystem:
    def __init__(self):
        self.entry_records = []
        self.exit_records = []
        
    def record_entry(self, employee, time):
        self.entry_records.append((employee, time))
        
    def record_exit(self, employee, time):
        self.exit_records.append((employee, time))
        
    def get_employee_records(self, employee):
        employee_records = []
        for entry in self.entry_records:
            if entry[0].get_employee_id() == employee.get_employee_id():
                employee_records.append(('Entry', entry[1]))
                
        for exit in self.exit_records:
            if exit[0].get_employee_id() == employee.get_employee_id():
                employee_records.append(('Exit', exit[1]))
        
        employee_records.sort(key=lambda x: x[1])
        return employee_records

SecuritySystem 类中,我们定义了安保系统对象,包含进入记录和离开记录,以及相应的方法实现。其中,记录为一个(Employee, 时间)的二元组。record_entry 方法记录员工进入的记录,record_exit 方法记录员工离开的记录,get_employee_records 方法查询某个员工的所有出入记录。

最后是 Door 类:

class Door:
    def __init__(self):
        self.security_system = SecuritySystem()
        
    def employee_in(self, employee, time):
        employee.set_enter_time(time)
        self.security_system.record_entry(employee, time)
        
    def employee_out(self, employee, time):
        employee.set_leave_time(time)
        self.security_system.record_exit(employee, time)

Door 类中,我们定义了门的对象,包含进入门和离开门,以及相应的进出门的方法实现。我们在 Door 类中定义了安保系统对象 security_system,员工进入和离开门的时候,通过 security_system 记录员工的行为。

以上就是门禁系统的对象设计和实现。这种面向对象的设计方式代码结构清晰、流程可控,且易于维护和修改。