2015-05-20 46 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做什么,它应该只是告诉他,有一些用户输入。