1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| from abc import ABC, abstractmethod from typing import Protocol
class Visitor(Protocol): """访问者接口"""
def visit_developer(self, developer: 'Developer') -> float: ...
def visit_manager(self, manager: 'Manager') -> float: ...
def visit_intern(self, intern: 'Intern') -> float: ...
class Employee(ABC): """员工接口"""
def __init__(self, name: str): self.name = name
@abstractmethod def accept(self, visitor: Visitor) -> float: ...
class Developer(Employee): """开发人员"""
def __init__(self, name: str, salary: float, overtime_hours: float): super().__init__(name) self.salary = salary self.overtime_hours = overtime_hours
def accept(self, visitor: Visitor) -> float: return visitor.visit_developer(self)
class Manager(Employee): """经理"""
def __init__(self, name: str, salary: float, bonus: float): super().__init__(name) self.salary = salary self.bonus = bonus
def accept(self, visitor: Visitor) -> float: return visitor.visit_manager(self)
class Intern(Employee): """实习生"""
def __init__(self, name: str, hourly_rate: float, hours_worked: float): super().__init__(name) self.hourly_rate = hourly_rate self.hours_worked = hours_worked
def accept(self, visitor: Visitor) -> float: return visitor.visit_intern(self)
class SalaryCalculator: """薪资计算访问者"""
def visit_developer(self, developer: Developer) -> float: base = developer.salary overtime_pay = developer.overtime_hours * 100 return base + overtime_pay
def visit_manager(self, manager: Manager) -> float: return manager.salary + manager.bonus
def visit_intern(self, intern: Intern) -> float: return intern.hourly_rate * intern.hours_worked
class BonusCalculator: """奖金计算访问者"""
def visit_developer(self, developer: Developer) -> float: base_bonus = developer.salary * 0.1 overtime_bonus = developer.overtime_hours * 50 return base_bonus + overtime_bonus
def visit_manager(self, manager: Manager) -> float: return manager.salary * 0.2
def visit_intern(self, intern: Intern) -> float: return 0.0
class ReportGenerator: """报表生成访问者"""
def visit_developer(self, developer: Developer) -> float: print(f"开发人员: {developer.name}, 基础工资: {developer.salary}, 加班时长: {developer.overtime_hours}") return 0.0
def visit_manager(self, manager: Manager) -> float: print(f"经理: {manager.name}, 基础工资: {manager.salary}, 奖金: {manager.bonus}") return 0.0
def visit_intern(self, intern: Intern) -> float: print(f"实习生: {intern.name}, 时薪: {intern.hourly_rate}, 工作时长: {intern.hours_worked}") return 0.0
class EmployeeList: """员工列表对象结构"""
def __init__(self): self.employees: list[Employee] = []
def add_employee(self, employee: Employee) -> None: self.employees.append(employee)
def process(self, visitor: Visitor) -> float: total = 0.0 for emp in self.employees: total += emp.accept(visitor) return total
def main(): employees = EmployeeList() employees.add_employee(Developer("张三", 15000, 10)) employees.add_employee(Manager("李四", 25000, 5000)) employees.add_employee(Intern("王五", 50, 160))
salary_calc = SalaryCalculator() total_salary = employees.process(salary_calc) print(f"\n总薪资支出: {total_salary:.2f}")
bonus_calc = BonusCalculator() total_bonus = employees.process(bonus_calc) print(f"\n总奖金支出: {total_bonus:.2f}")
print("\n=== 员工报表 ===") report_gen = ReportGenerator() employees.process(report_gen)
if __name__ == "__main__": main()
|