2012-02-14 69 views
1

我是面向對象設計的新手,仍然在學習它。 我爲火車預定系統設計了一個班,但我不確定如何對主要預訂班進行建模。設計火車預定系統班

這是我設計的外觀:

public class Station { 
    private int stationID; 
    private String stationName; 

    // Getters and Setters 
} 

public class Train { 
    private int trainID; 
    private String trainName; 
    private Map<Station, Double> trainStationsWithFares; 

    public Train(int ID, String trainName, Station[] stations) { 
    // Initialize ID and name and create a hashmap with all stations and 
    // zero fare initially for all stations. 
    .... 
    trainStationsWithFares = new HashMap<Station, Double>(); 
    for(Station s : stations) trainStationsWithFares.put(s, new Double(0.0)); 
    } 

    // Getters and Setters (including methods to add new stations with fares and 
    // update fares of existing stations 
} 

public class Passenger { 
    private String Name; 
    private int id; 
    private int age; 
    private static final enum { Male, Female } gender; 
} 

public class TicketDetails { 
    private Train t; 
    private Station from; 
    private Station to; 
    private Passenger passenger; 

    // Getters and Setters 
} 

public class TrainTicket { 
    private int ID; 
    private TicketDetails ticketDetails; 
    private Double fare; 

    public TrainTicket(TicketDetails ticketDetails) 
     throws InvalidTrainException, InvalidFromStationException, 
      InvalidToStationException { 
     ... 
     calculateFare(); 
    } 

    // Calculates fare based on Train and from and to Stations and taxes, etc. 
    private void calculateFare() { 
     this.fare = ... 
    } 
} 

// Assuming card payment only for online reservation system for simplicity. 
// Design can be modified and enhanced suitably. 
public class PaymentDetails { 
    private String cardNumber; 
    private String cardExpirationMonth; 
    private String cardExpirationYear; 
    private String cardCVV; 

    // Getters and Setters 
} 


問題:我應該保留類這個樣子的? 如果是這樣,該類中的方法將如何訪問其他類的對象,如TrainTicket,PaymentDetails等。

public abstract class ReservationSystem { 

    // Purchase train ticket by providing ticket details and payment details. 
    public abstract TrainTicket purchaseTicket(TicketDetails ticketDetails, 
     PaymentDetails paymentDetails);  

    // Cancel existing train ticket by providing ticket reference and payment details 
    // for cancellation charges. 
    public abstract boolean cancelTicket(TrainTicket tt, PaymentDetails details); 

    // Modify existing train ticket by providing existing ticket reference,new ticket 
    // details and payment details for any additional charge or modify charges. 
    public abstract TrainTicket modifyTicket(TrainTicket existingTicket, 
     TicketDetails newTicketDetails, PaymentDetails paymentDetails) { 
    } 
} 


還是應該是這樣的:

public class ReservationSystem{ 
    private Map<trainId, Train> trains; 
    private Ticketdetails ticketdetails; 
    private PaymentDetails paymentDetails; 
    private TrainTicket tt; 

    public vector<Train> getTrain(TicketDetails ticketdetails); 
    public TrainTicket purchaseTicket(TicketDetails ticketDetails, 
     PaymentDetails paymentDetails);  
    public boolean cancelTicket(TrainTicket tt, PaymentDetails details); 
    public TrainTicket modifyTicket(TrainTicket existingTicket, 
     TicketDetails newTicketDetails, PaymentDetails paymentDetails); 
} 


我想知道應該如何主要訂座艙位訪問的方法和其他類的成員。

在此先感謝。

+3

這不是C++。 – Pubby 2012-02-14 07:49:02

+2

更適合http://codereview.stackexchange.com/ – Sikorski 2017-02-08 14:03:53

回答

0

在前面的方法中,ReservationSystem類是abstract,即它們不能被實例化但應該被子類化以訪問這些方法。如果你只有一種預訂系統,那麼爲它創建一個抽象類沒有意義。除此之外,我沒有看到您爲ReservationSystem課程指定的2個替代方案之間的區別。

來到第二個問題,

我想知道如何應主要保留類訪問其他類

TrainStationTrainTicket類的方法和成員應公開的公共訪問器(getter和setter)以及訪問其數據的方法。由於您沒有指出您是否使用數據庫來存儲預訂信息(例如預訂門票等),因此您需要在ReservationSystem類中保留預訂信息,即應該有一個像Map這樣的數據結構來存儲預訂機票(Ticket.Id將是最有可能的關鍵),取消機票等。撥打bookTicket()會將票添加到MapcancelTicket()Map中刪除票。

另外,ReservationSystem還需要維護有效列車的列表以及與每個實例關聯的車站。與系統的所有交互都是通過ReservationSystem類的實例進行的。

-1
import java.util.*; 
import javax.swing.JOptionPane; 
/* 
@Author 12CSE54 
@ Date 29.10.14 
*/ 

public class reservation extends javax.swing.JFrame { 
Scanner s=new Scanner(System.in); 
List arr1=new ArrayList(); 
    Set<Integer> arr= new HashSet<Integer>(); 

static String aa,bb,cc; 
static int ag; 
static int pp; 
    /** Creates new form reservation */ 
    public reservation() { 
     initComponents(); 
    } 
    public reservation(String na,int ag,String from,String to) 
    { 
    aa=na; 
    bb=from; 
    cc=to; 
    pp=ag; 

    } 
int var,c=0; 
     int b; 

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
     b=Integer.parseInt(JOptionPane.showInputDialog(this,"Enter the seat number")); 

     Iterator<Integer> itr=arr.iterator(); 
     while(itr.hasNext()) 
     { 
       var=itr.next(); 
       if(b==var) 
       { 
     JOptionPane.showMessageDialog(this,"ticket already reserved"); 
        c=0; 
        break; 
       } 
       else 
       { 
        c=1; 
       } 
     } 

       if(c==1) 
       { 
        JOptionPane.showMessageDialog(this,"Ticket Available Ticket Booked for you"); 
       } 
     arr.add(b); 
     JOptionPane.showMessageDialog(this,"booked sucessfully"); 
}           
int[] a=new int[100]; 
     Iterator itr=arr1.iterator();  
     int flag1=-1,f=0; 
      int b1; 
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {           

    b1=Integer.parseInt(JOptionPane.showInputDialog(this,"Enter the seat number allocated to you")); 
     Iterator<Integer> itr=arr.iterator(); 
     while(itr.hasNext()) 
     { 

       var=itr.next(); 
       if(b1==var) 
       { 
        f=1; 
        arr.remove(flag1); 
        break; 
       } 
       else 
       { 
        f=0; 
       } 
       flag1++; 
     } 
     if(f==1) 
     { 

      JOptionPane.showMessageDialog(this,"Tickets cancelled"); 

     } 
     else if(f==0) 
     { 
      JOptionPane.showMessageDialog(this,"Tickets is not already reserved"); 
     } 



}           
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

passengersdetails p=new passengersdetails(); 
p.setVisible(true); 
    arr.add(1); 
    arr.add(2); 
    arr.add(10); 


}           

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           

      jFrame1.setSize(600, 600); 
      jFrame1.setVisible(true); 
    jTextField1.setText(String.valueOf(aa)); 
    jTextField2.setText(String.valueOf(pp)); 
     jTextField3.setText(String.valueOf(bb)); 
     jTextField4.setText(String.valueOf(cc)); 
     jTextField5.setText(String.valueOf(b)); 



}           

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {           
list i=new list(); 
i.setVisible(true); 
}           

private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {           
System.exit(0); 
}           
    public static void main(String args[]) 
{ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new reservation().setVisible(true); 
      } 
     }); 
    } 
+0

沒有解釋的代碼轉儲並不是非常有幫助,特別是當問題是關於設計時。 – Robert 2017-09-10 20:15:37

+0

另請注意,問題不在於GUI設計。 GUI類不應該污染域對象。 – Robert 2017-09-10 20:16:02