所以我有如下的设计:
对于模型:
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方法,因此我甚至不确定是否应该创建一个票证管理器类,并将这些方法添加到模型中。我对什么时候应该在模型中添加方法或将它们放入自己的类中感到困惑。
发布于 2019-05-11 21:54:39
创建工单接口
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
发布于 2019-05-11 22:50:30
您可能希望在票证管理器接口中使用泛型:
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;
}https://stackoverflow.com/questions/56090886
复制相似问题