我正在创建我的第一个Java项目,并尝试学习OO编程以及MVC。
假设您有一个“产品”类和该类的许多对象。您的GUI想要显示这些对象的列表,可能还有一些过滤器等。我可以想到几种方法:
这样做的正确方法是什么,你会把代码放在哪里?
答案 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);
}
}