(1)抽象类Employer,包含姓名、部门和工资三个数据域,计算工资的方法computerSalary()方法定义为抽象方法; (2)定义Employer的子类月薪制员工MonthlyEmployee,工资计算方法为基本工资+奖金 (3)定义Employer的子类小时制员工HourlyEmployee,工资计算方法为小时费率*该月工作小时数 要求: (1)画出UML类图 (2)编写代码,创建MonthlyEmployee及HourlyEmployee的对象,调用computerSalary()方法 (3) 思考这样设计有何缺陷?(提示,例如一个人既是月薪制员工,又是小时制员工)
时间: 2024-04-08 11:31:12 浏览: 19
以下是满足要求的UML类图:
```
+----------------+ +------------------+
| Employer |<--------------->| MonthlyEmployee |
+----------------+ +------------------+
| - name: String | | - bonus: double |
| - department: | +------------------+
| String | | + computeSalary()|
| - salary: | +------------------+
| double |
+----------------+
^
|
|
+----------------+
| HourlyEmployee |
+----------------+
| - hourlyRate: |
| double |
| - hoursWorked: |
| int |
+----------------+
| + computeSalary()|
+----------------+
```
下面是使用Java代码实现上述需求:
```java
public abstract class Employer {
private String name;
private String department;
private double salary;
public Employer(String name, String department, double salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
public abstract double computeSalary();
// Getters and setters for name, department, and salary
}
public class MonthlyEmployee extends Employer {
private double bonus;
public MonthlyEmployee(String name, String department, double salary, double bonus) {
super(name, department, salary);
this.bonus = bonus;
}
@Override
public double computeSalary() {
return getSalary() + bonus;
}
}
public class HourlyEmployee extends Employer {
private double hourlyRate;
private int hoursWorked;
public HourlyEmployee(String name, String department, double salary, double hourlyRate, int hoursWorked) {
super(name, department, salary);
this.hourlyRate = hourlyRate;
this.hoursWorked = hoursWorked;
}
@Override
public double computeSalary() {
return hourlyRate * hoursWorked;
}
}
public class Main {
public static void main(String[] args) {
MonthlyEmployee monthlyEmp = new MonthlyEmployee("John", "Finance", 5000, 1000);
HourlyEmployee hourlyEmp = new HourlyEmployee("Jane", "Admin", 10, 20, 160);
System.out.println("Monthly Employee Salary: " + monthlyEmp.computeSalary());
System.out.println("Hourly Employee Salary: " + hourlyEmp.computeSalary());
}
}
```
这样的设计缺陷在于,一个人既是月薪制员工又是小时制员工时,需要创建两个不同的对象来表示同一个人。这可能会导致数据冗余和不一致性。同时,如果需要对该员工进行统一管理和计算工资,就需要编写额外的代码来处理这种情况。为了解决这个问题,可以考虑引入更灵活的设计模式,例如策略模式或组合模式。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)