在哪里放置列出对象的方法

时间:2011-12-08 13:39:48

标签: java model-view-controller oop

我正在创建我的第一个Java项目,并尝试学习OO编程以及MVC。

假设您有一个“产品”类和该类的许多对象。您的GUI想要显示这些对象的列表,可能还有一些过滤器等。我可以想到几种方法:

  • GUI可以简单地读取所有对象并列出它们。
  • 创建一个返回所有对象的全局可用方法。这可以放在某种全局功能的存储库中。
  • 在Products类中创建一个静态方法,返回所有对象的列表。

这样做的正确方法是什么,你会把代码放在哪里?

2 个答案:

答案 0 :(得分:2)

当你想学习MVC时,你已经知道为了实现MVC模式,你需要三层:模型,视图,控制器。在您的情况下,您有两个层,Model( Product )和View( ProductGUI ,假设这是一个不同的类)。你缺少的是控制器。

为了从MVC中利用,我建议您使用API​​方法实现Controller层,以便拥有一个接口ProductController;以及实现接口ProductControllerImpl的类。这种接口级分离使您可以在替代实现之间切换,并允许模拟您的服务以进行用户界面测试(有关详细说明,请参阅Wikipedia)。

让我也试着用一个简单的例子解释一下。

假设您为Controller层创建接口:

public interface ProductController {
    public List<Product> listProducts();
    public List<Product> listProducts(NameFilter nameFilter);
}

然后,您可以为此接口创建Mock实现,以便进行测试:

public class ProductControllerImplMock implements ProductController {
    List<Product> products;

    public ProductControllerImplMock() {
        products = new ArrayList<Product>();
    }

    public List<Product> listProducts() {
        products.add(new Product("A"));
        products.add(new Product("B"));
        return products;
    }

    public List<Product> listProducts(NameFilter nameFilter) {
        products.add(new Product("A"));
        return products;
    }
}

注意:假设您有一个NameFilter类,旨在按名称过滤产品。

如果您决定使用数据库来存储您的产品,那么您可以实现ProductControllerDatabaseImpl,它将查询您的数据库并检索实体以进行列表,并且最有可能将WHERE子句引入查询listProducts(NameFilter)方法。

实际上,事情从未如此简单。此示例中显示的内容将在更复杂的应用程序中称为DAO(数据访问对象),并且将有一个单独的层,通常称为Business层而不是Controller层,它将实现应用程序的实际逻辑。但为了简单起见,我尽量使示例尽可能简单。

答案 1 :(得分:0)

恕我直言,OOP方法是通过Products类中的基本访问器方法公开集合。如果您担心要修改的集合,请使用Collections类提供的一个不可修改的集合来包装集合,或者返回一个副本。

编辑 -
关于GUI,请注意与并发相关的问题。

示例 -

final class Products
{
    private final List<Foo> listOfFoo;

    Products(List<Foo> listOfFoo)
    {
        this.listOfFoo = listOfFoo;
    }

    public List<Foo> getListOfFoo()
    {
        if(listOfFoo.isEmpty())
        {
            return Collections.emptyList();
        }

        return Collections.unmodifiableList(listOfFoo);
    }
}