我有一个关于我正在为学校做的项目的问题。我必须做以下事情:
编写一个Java程序,该程序使用decorator类来添加功能员工。在典型的公司中,员工会被要求履行多项职责,如安全部门负责人协调员、招聘人员或社区联络人。你应该除了这些之外还有其他的。您的Java程序将创建Employees然后在运行时对这些员工进行装饰。
创建一个名为Employee的抽象类,其姓氏和description字段和getDescription()方法。创建混凝土名为SalariedEmployee的类,该类扩展了Employee。创建摘要名为ResponsibilityDecorator的类,该类能够装饰employee,并将该员工的责任作为字符串返回。它会有一个抽象的getDescription方法。创建一些职务类别扩展ResponsibilityDecorator类并实现getDescription()方法。
在主测试程序中,创建至少5个Employee对象并通过它们传递给每个decorator类的构造函数。第一个员工应该是您,所以请使用您的姓氏。然后,打印每个通过调用其getDescription()方法调用Employee。所有员工应没有相同数量的责任。程序的输出每个都应该看起来像这样:
[姓氏]:经理、招聘人员、社区联络人、产品设计师
以下是我迄今为止所做的:
Employee.java:
import java.util.*;
public abstract class Employee
{
String lastName, description;
public String getDescription()
{
return description;
}
}
带薪员工.java:
import java.util.*;
public abstract class SalariedEmployee extends Employee
{
String lastName, description;
public abstract String getDescription();
}
ResponsibilityDecorator.java:
import java.util.*;
public abstract class ResponsibilityDecorator
{
public String getDescription()
{
return employee.getDescription();
}
Employee employee;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public boolean equals(Object obj) {
return employee.equals(obj);
}
public int hashCode() {
return employee.hashCode();
}
public String toString() {
return employee.toString();
}
public ResponsibilityDecorator(Employee employee) {
super();
this.employee = employee;
}
public ResponsibilityDecorator() {
super();
// TODO Auto-generated constructor stub
}
}
Rodriguez.java(第一类员工)
import java.util.*;
public abstract class Rodriguez extends ResponsibilityDecorator
{
Employee employee1;
String lastName = "Rodriguez";
String description = "Tech Support";
public Rodriguez (Employee employee1)
{
this.employee = employee;
}
public String getDescription()
{
return description;
}
}
Doe.java(第二类员工):
import java.util.*;
public abstract class Doe extends ResponsibilityDecorator
{
Employee employee2;
String lastName = "Doe";
String description = "Security Guard, Police Officer";
public Doe (Employee employee2)
{
this.employee = employee;
}
public String getDescription()
{
return description;
}
}
Jill.java(第三个员工对象):
import java.util.*;
public abstract class Doe extends ResponsibilityDecorator
{
Employee employee2;
String lastName = "Doe";
String description = "Security Guard, Police Officer";
public Doe (Employee employee2)
{
this.employee = employee;
}
public String getDescription()
{
return description;
}
}
Maria.java(第四级员工):
import java.util.*;
public abstract class Maria extends ResponsibilityDecorator
{
Employee employee4;
String lastName = "Maria";
String description = "Receptionist, Valet, Cashier, Restock";
public Maria (Employee employee4)
{
this.employee = employee;
}
public String getDescription()
{
return description;
}
}
James.java(第五个员工班):
import java.util.*;
public abstract class James extends ResponsibilityDecorator
{
Employee employee5;
String lastName = "James";
String description = "Manager, CEO, Economy, President, Analytics";
public James (Employee employee5)
{
this.employee = employee;
}
public String getDescription()
{
return description;
}
}
Test.java:
import java.util.*;
public class Test
{
public static void main(String[] args)
{
Employee employee1 = new Rodriguez();
System.out.println("Rodriguez:" +
employee1.getDescription());
Employee employee2 = new Doe();
System.out.println("Doe" +
employee2.getDescription());
Employee employee3 = new Jill();
System.out.println("Jill:" +
employee3.getDescription());
Employee employee4 = new Maria();
System.out.println("Maria:" +
employee4.getDescription());
Employee employee5 = new James();
System.out.println("James:" +
employee5.getDescription());
}
}
出于某种原因,它显示了一个类型不匹配错误。我一直在网上搜索,甚至问过一些人。我尝试了许多修复,但它们只是造成了另一个错误。我不知道如何解决这个问题。
这里似乎有几个问题。让我们浏览一下作业文本:
创建一个名为Employee的抽象类,包含姓氏和描述字段以及getDescription()方法。
这看起来不错
创建一个名为SalariedEmployee的具体类,该类扩展Employee。
您使SalariedEmployee成为一个抽象类。删除abstract
并实现getDescription方法。
创建一个名为ResponsibilityDecorator的抽象类,该类能够装饰员工并将员工的责任作为字符串返回。它将有一个抽象的getDescription方法。
根据我熟悉的decorator模式,如果ResponsibilityDecorator
应该"装饰员工",那么它应该扩展Employee——你学到了其他东西吗?
从任务的描述中,我希望看到:
abstract class ResponsibilityDecorator extends Employee {
Employee employee;
ResponsibilityDecorator(Employee e) { this.employee = e; }
abstract String getDescription();
}
创建一些作业类别类,这些类扩展了ResponsibilityDecorator类并实现了getDescription()方法。
除非您将Maria、Rodriguez等视为"工作类别",否则您没有这样做。
"经理"职位类别可能如下所示:
class Manager extends ResponsibilityDecorator {
Manager(Employee employee) { super(employee); }
String getDescription() { return employee.getDescription() + " Manager"; }
}
在主测试程序中,创建至少5个Employee对象
也许您混淆了上一步,创建了5个员工类(Maria,Rodriguez,…)?
请注意,此练习的解决方案会让专业开发人员挠头,因为这不是表示程序中工作类别或职责的合理方式。
您正在创建Employee类型对象的实例但根据您的代码,他们都没有关系,也不是Employee类的子级。
您定义了什么是Employee和Salary员工,但您的人员对象都没有扩展它们。
一些基本的OOP概念在代码中不匹配。abstract class
不能用于初始化(正如您所做的那样)Employee employee1 = new Rodriguez();
行代码很好,但错误源自Rodriguez class
尝试使用以下内容更改类定义:public class Rodriguez extends ResponsibilityDecorator
这不会解决问题,因为Rodriguez
_ResponsibilityDecorator
(类型)和Employee
(类型)之间没有关系,但这是理解代码的又一步。(只有一个实例varEmployee
嵌入在ResponsibilityDecorator
上。它可以用来重新设计代码并用Employee
建立链接,但我怀疑你是否会遵循这种模式
通常所有的employees
都应该从Employee
派生,然后适当的代码调整将是public class Rodriguez extends Employee
。。。并且在代码应该被适配之后。(你应该从这里开始)。只要再看看图案就行了。
还有一个提示,正确的Name_Rodriguez
不是一个适当的class def
,它更像是一个实例的属性。例如:Employee e1 = new CustomEmployee("Rodriguez","last name", age_int)
和CustomEmployee
是extends Employee
。。。(员工可能是abstract
或interface
)