2017-03-16 65 views
0

因此,我製作了一個模擬星巴克應用程序,每次客戶點擊「訂購」按鈕時,產品都會添加到ArrayList中,並且此ArrayList將被所有人訪問。我有點糊塗在哪裏插入全球的ArrayList代碼...如何讓所有JFrames都可以訪問ArrayList以及如何更新它?

這是我的btnOrder代碼:

private void btnOrderActionPerformed(java.awt.event.ActionEvent evt) {           
    String name = lblName.getText(); 
    String size = cmbSize.getSelectedItem().toString(); 
    int quantity = (int) spnrQuantity.getValue(); 
    int price=0; 

    if (size.equals("Tall 12oz")) { 
     price = 170; 
    } else if (size.equals("Grande 16oz")) { 
     price = 180; 
    } else if (size.equals("Venti 20oz")) { 
     price = 190; 
    } 

    Global.list.add(new Object()); 
    new Receipt(name, size, quantity, price).setVisible(true); 
} 

這是我收到的幀代碼包含JTable的,所以我可以顯示訂單:

public class Receipt extends javax.swing.JFrame { 

/** 
* Creates new form Receipt 
*/ 
public Receipt() { 
    initComponents(); 
} 

String size, name; 
int quantity, price; 

public Receipt(String name, String size, int quantity, int price) { 
    initComponents(); 

    this.name = name; 
    this.size = size; 
    this.quantity = quantity; 
    this.price = price; 

    addToTable(); 
} 

void addToTable() { 
    DefaultTableModel table = (DefaultTableModel) tblCart.getModel(); 

    Vector v = new Vector(); 

    v.add(name); 
    v.add(size); 
    v.add(price); 
    v.add(quantity); 

    table.addRow(v); 
} 

這是可訪問的ArrayList代碼:

public class Global { 
    public static ArrayList<Object> list = new ArrayList<>(); 

    private Global(){ 

    } 
} 
+2

全局狀態可能是一個噩夢來管理。您可以使用單例作爲經理,也可以將模型的實例傳遞給每個人。我會考慮的一件事是不直接暴露ArrayList,而是提供周圍的管理功能,這樣可以更好地控制對列表的訪問。模型方法將進一步允許您控制程序的哪些不同部分可以執行(爲什麼應允許自定義從列表中刪除元素?爲什麼brista能夠添加它們?)通過在接口上使用 – MadProgrammer

+0

@MadProgrammer可以你請用簡單的英語說話嗎?英語不是我的第一個語言。謝謝 –

+0

[程序接口沒有實現](http://stackoverflow.com/questions/2697783/what-does-program-to-interfaces-not-implementations-mean); [模型 - 視圖 - 控制器(https://blog.codinghorror.com/understanding-model-view-controller/); [單一責任原則](https://en.wikipedia.org/wiki/Single_responsibility_principle) – MadProgrammer

回答

1

管理全局狀態可以是一個噩夢,而你可以使用一個單獨解決這個問題,它違反了Single responsibility principle。它還刪除訪問控制,允許任何人以他們認爲合適的方式修改列表而無需控制。

另一種解決方案是使用某種模型,它可以在各種組件之間傳遞,如果您巧妙地使用interface,您可以控制誰可以做什麼和什麼時候做什麼。

這是Model-View-Controllerprogram to interface not implementation原理的核心概念。

的基本想法是,你會創建一個「模型」,它保持你要共享的數據,在此,主要是在客戶訂單中的項目(也許客戶的名字)

您可以創建一個適當的訂購併將其引用到「訂單」視圖,在那裏它可以添加/刪除/更新項目到模型。完成後,「控制器」然後將模型的相同實例傳遞給「結帳」視圖,該視圖將使用該信息來生成帳單(並且可能還有支付信息)並最終存儲交易

然後您可以從模型中獲取最終的信息,並告訴發生了什麼。因爲您可能需要控制複雜的狀態,例如,您可能需要多個模型,例如,您可以將「訂單」模型傳遞給「結賬」視圖,但它可能會創建一個「交易「模型,其中包裝」訂單「模型

+0

非常感謝! –

0

你可以在這裏使用Singleton設計模式。對於單身人士,您可以利用Polymorphism,這對靜態物體來說是不可能的。

enum Global { 
    INSTANCE; 

    private ArrayList<Object> list = new ArrayList<>(); 

    public void add(Object obj) { 
     //custom validations (if any) 
     list.add(obj); 
    } 

    public Object get(int index) { 
     //check here for permissions, validations etc... 
     return list.get(index); 
    } 

    //other methods to access your shared objects 
    ... 
} 

在這個例子中,singleton模式是使用ENUM實現的,它確保了線程的安全性。你也可以使用The ‘Inner Class’ Approach來實現單線程,這也是線程安全的。

使用

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

    ... 

    Global.INSTANCE.add(new Object()); 
    new Receipt(name, size, quantity, price).setVisible(true); 
} 

Difference between static class and singleton pattern?

+0

:)更好...這是挑剔的,但對我來說問題是,這允許任何人添加/刪除/修改內容在客戶的情況下這應該是沒有意義的(除非我住在病人身邊並且不想等待,那麼我可以在我之前刪除列表中的所有元素:D),那將是我的只有在這種情況下使用單身問題。您可能還需要對[單身人士是邪惡的](https://www.google.com.au/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=singletons+are+evil&* ) - 親自,我喜歡他們,但那就是我 – MadProgrammer

相關問題