dimanche 26 mars 2017

What Patter design to get rid of the type casting in my case?

public abstract class Employee {
    String name;
    String position
    public Employee(String name, String position) {
      this.name = name;
      this.position = position
   }
 }

public class Pilot extends Employee {
      public Pilot(String name,String position) {
         super();
  }
      public void flight() {//flight the plane}
     //getter and setter for the fields
}

public class Attendance extends Employee {
      public Attendance(String name,String position) {
         super();
  }
      public Food servingFood(String foodName) {}

}

// there will be many other positions


public class Company {

   HashMap<String, ArrayList<Employee>> employeeTable; //values is a list of     workers, key is the position

   public Company() {this.employeeTable = new HashMap<>();}
   public initializeEmployeeTable(file) {} //read file, and create keys in map (file contains information of the position)
  public Worker hireEmployee(String position, String name){
      if (position.equals("pilot")) {  
             Pilot p = Pilot(name);    
              employeeTable.get("pilot").add(p);
              return p
  }
      else if (position.equals("flightAttendance")) {// the else if statement continuous to check the other position; }
 } 

 public Worker callEmployee(String position, String name) {
    for ( Employee e : employeeTable.get(position) ) {
          if e.getName().equals(name) {
                return e;
    }
   }
   return null;
}



public static void main(String[] args) {
  Company company = new Company();
  company.initializeEmployeeTable(filePath);
  File eventFile = new File(filePath); // event file describes what's happening in real world; read the lines, and call the program so that program simulates the real world events
  sc = new Scanner(eventFile);
  do {
      String currentEvent = sc.nextLine();
      String[] currentEventParts = currentEvent.split(", ");
     if (currentEvent[0].equals("New Airplane")) { // currentEvent looks like {"New Airplane", "Attendance"// this part can be other position name, "Linda"}
        Worker w = company.hireEmployee(currentEventParts[1], currentEventParts[2]); }
     else if ((currentEvent[0].equals("flying"))) {
        Worker w = company.callEmployee(currentEvent[0], currentEvent[1])
               if (w.getPosition().equals("Pilot")) {(Worker) w.flight()}
                if (w.getPosition().equals("Attendance")) {(Worker) w.serveFood()}
     }
}

The reason there is HashMap for employee because there will be many positions; and reading the event file (when the first index is "New Airplane"); I don't want to go check the following index (would be name and position) with so many if statements to create corresponding employee. But when comes to calling specific methods, I need type casting now; since each method can be different (different type parameter, return type); so it's not ideal to have this methods be abstract method in super class employee and have the subclass implements the body.

Any advices: employee data structure; reading file strategy, pattern design would be appreciated. thanks

Aucun commentaire:

Enregistrer un commentaire