【问题标题】:Where to place a method for listing objects在哪里放置列出对象的方法
【发布时间】:2012-01-15 22:34:03
【问题描述】:

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

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

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

执行此操作的正确方法是什么,您会将代码放在哪里?

【问题讨论】:

    标签: java model-view-controller oop


    【解决方案1】:

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

    为了利用 MVC,我建议您使用 API 方法实现控制器层,以便您拥有一个接口,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(数据访问对象),并且将有一个单独的层,通常称为业务层而不是控制器层,它将实现应用程序的实际逻辑。但为了简单起见,我尽量让示例简单。

    【讨论】:

      【解决方案2】:

      恕我直言,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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-12
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多