Улучшение наследования и дизайна интерфейса - PullRequest
2 голосов
/ 11 мая 2019

, поэтому у меня есть следующий дизайн:

для моделей:

public class ParentTicket{
  protected ticketAttribute1
  protected ticketAttribute2
  protected ticketAttribute3

  //getters and setters here
}

public class ChildTicket1 extends ParentTicket{
  private childTicket1Attr1
  private childTicket1Attr2
  private childTicket1Attr3

  //getters and setters here
}

public class ChildTicket2 extends ParentTicket{
  private childTicket2Attr1
  private childTicket2Attr2
  private childTicket2Attr3

  //getters and setters here
}

Для менеджера билетов у меня есть следующее

public class TicketManager1{

   public ArrayList<ChildTicket1> getAlltickets(){ 
       //some implementation 
   }

   public void saveTicketToDB(ChildTicket1 ticket){ 
       //some implementation 
   }

}

public class TicketManager2{

   public ArrayList<ChildTicket2> getAlltickets(){ 
       //some implementation 
   }

   public void saveTicketToDB(ChildTicket2 ticket){ 
       //some implementation 
   }

}

Я в замешательствекак я могу улучшить дизайн, потому что в настоящее время будет трудно добавить больше менеджеров билетов / других типов билетов (я так думаю, по крайней мере)

Я попытался сделать интерфейс для реализациименеджерами по тикетам:

public interface IManageTickets{
  public Collection getAllTickets();
  public void saveTicketToDB(Ticket ticket);
  //some other methods
}

но я не могу реализовать это должным образом, потому что параметр Ticket не принимает дочерние тикеты.

также я собираюсь использовать подход MVC здесьпоэтому я даже не уверен, стоит ли мне создавать класс менеджера билетов и просто добавлять эти методы в модель.Я не понимаю, когда вам следует добавлять методы в модель или помещать их в их собственный класс.

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Возможно, вы захотите использовать обобщенные элементы в интерфейсе диспетчера билетов:

public interface TicketManager<T extends ParentTicket> {
    Collection<T> getTickets();
    void saveTicketToDb(T ticket);
}

Ключом здесь является ограничение универсального параметра T в качестве подкласса ParentTicket.Реализация этого для ChildTicket1 будет выглядеть следующим образом:

public class TicketManager1 implements TicketManager<ChildTicket1> {
    @Override
    public Collection<ChildTicket1> getTickets() {
        // implementation goes here
        return null;
    }

    @Override
    public void saveTicketToDb(ChildTicket1 ticket) {
        // implementation goes here
    }
}

Этот подход может быть особенно полезен, если вам нужно создать API, который предоставляет доступ ко всем типам заявок, например:

public Collection<ParentTicket> getAllTickets() {
    List<TicketManager<? extends ParentTicket>> managers; // contains a list of all TicketManager implementations
    List<ParentTicket> tickets = new ArrayList<>();
    for (TicketManager<? extends ParentTicket> manager : managers) {
        tickets.addAll(manager.getTickets());
    }
    return tickets;
}
0 голосов
/ 11 мая 2019

создать интерфейс для Билетов

public interface Tickets {

}

Чтобы различные билеты реализовали интерфейс

public class ChildTicket1 implemnets ParentTicket{


  //getters and setters here
}


public class ChildTicket2 implemnets ParentTicket{


  //getters and setters here
}

Это класс менеджера заявок, передаваемый тип в качестве типа интерфейса заявки

public class TicketManager{

       public ArrayList<Tickets> getAlltickets(){ 
           //some implementation 
       }

       public void saveTicketToDB(Tickets ticket){ 
           //some implementation 
       }

    }

если вы хотите свои атрибуты, вы можете сделать

public class Tickets {
 protected ticketAttribute1
 protected ticketAttribute2
 protected ticketAttribute3
}

public class ChildTicket1 extends ParentTicket{


  //getters and setters here
}


public class ChildTicket2 extends ParentTicket{


  //getters and setters here
}





public class TicketManager{

       public ArrayList<Tickets> getAlltickets(){ 
           //some implementation 
       }

       public void saveTicketToDB(Tickets ticket){ 
           //some implementation 
       }

    }

этот паттерн называется паттерном стратегии. Если вы хотите узнать больше о том, как разрабатывать свои приложения, больше узнать о шаблонах проектирования. это хороший справочник, найдите и прочитайте его, если хотите http://shop.oreilly.com/product/9780596007126.do

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...