2015-05-20 49 views
0

我想在我的程序中使用MVC模式實現觀察者模式。我正在這樣做,以便View可以看到我在模型中可能做的任何更改(我將稍後執行掃描器輸入並追加到已存在的HashMap中)。但我正在努力如何將Observer實現到我的程序中。在視圖中實現觀察器(Java)

這裏是視圖:

package product.view; 

import product.controller.Controller; 

public class View{ 
    private Controller cont; 

    public View(Controller cont) { 
     this.cont = cont; 
    } 

    public void test() { 
     cont.makeNewSale(); 
     enterItem(1); 
    } 

    private void enterItem(int itemId) { 
     int quantity = 1; 

     try { 
      System.out.println(""); 
      System.out.println("Result for item " + itemId + ": " + cont.enterItem(itemId, quantity)); 
      System.out.println(""); 
     } 
     catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

這裏是ProductCatalogue在型號:

package product.model; 

import java.util.Map; 

import java.util.HashMap; 

public class ProductCatalog { 
    private Map<Integer, ProductSpecification> products = new HashMap<Integer, ProductSpecification>(); 


    public ProductCatalog() { 
     products.put(1, new ProductSpecification(1, "low fat milk", 
    "a very long description, a very long description, a very long description", 10)); 
     products.put(2, new ProductSpecification(2, "butter", 
    "a very long description, a very long description, a very long description", 10)); 
     products.put(3, new ProductSpecification(3, "bread", 
    "a very long description, a very long description, a very long description", 10)); 
     System.out.println(products.toString()); 
    } 

    public ProductSpecification findSpecification(int itemId) { 
     return products.get(itemId); 
    } 

    boolean findSpecification() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 
} 
+0

爲什麼要將控制器作爲參數傳遞給視圖的構造函數? – Blip

+0

的確,爲什麼不建模? – Crazyjavahacking

+0

因爲我希望所有呼叫都從控制器轉到模型。 – Reps4Jesus

回答

2

看看在UML class diagram的觀察者模式: enter image description here

這表明你你需要什麼方法,甚至是部分實施。 基本上說,模型包含一個對象列表,它將調用某個方法。

你的問題是,你沒有精確地遵循這個模式,並混合關注。 controller決定用戶輸入後會發生什麼。 view不應該告訴controller做什麼,它應該只是告訴他,有一些用戶輸入。