如何在java中学习“关注点分离”

时间:2011-01-21 13:00:20

标签: java design-patterns frameworks

在另一个问题中,有人告诉我在我的java程序中实现以下内容。但是,我是Java的新手,我不知道如何开始将我的简单程序转换为这个结构:

Data Access Layer (read/write data)
Service Layer (isolated business logic)
Controller (Link between view and model)
Presentation (UI)
dependency injection. 
program to the interface:

这是否来自某个框架?我应该开始学习Spring吗?这个结构会自然地发展吗?或者,我可以在不使用框架的情况下逐一实现上述技术吗?

6 个答案:

答案 0 :(得分:1)

您可能想查看Domain Driven Design。代码示例使用Java。您列出的内容与任何特定技术相比都与设计相关。

答案 1 :(得分:1)

简而言之:

  • 数据访问层是应用程序的一个模块,它提供数据接口。数据可以在SQL数据库,XML,文件中的任何位置。您可以通过VO or DTO
  • 编写提供访问数据的接口的接口和类,通常为DAOs
  • 服务层包含大部分用例逻辑。服务层与数据访问层交互以在给定用例中执行任务。我没有找到关于入门服务层的好文章。您可能会看到herethere
  • 控制器是与服务层和/或数据访问层和/或其他控制器交互以执行指定客户端任务的控制器。

    例如,签核按钮控制器将请求签核操作/服务以使用户登录的所有服务上的用户会话无效,然后它将选择适当的视图或注销网页以转发用户。
  • 演示文稿是您的用户界面。它可以是由HTML或Java Swing窗口构成的网页,也可以是用户与之交互的任何内容。 GUI常用的术语。这是您的用户将使用鼠标点击,滚动,滑动和拖放进行交互的内容。这些操作与控制器映射,控制器根据用户在UI上执行的操作执行操作。
  • 依赖注入是一种连接各种组件的方法。网上有很多资源。你可以查看Martin Fowler's this article。它基本上是一种机制,允许组件的行为与即插即用设备非常相似,如果你知道什么插件在哪里。

    Spring是依赖注入的一个很好的实现。您可能不想编写自己的框架,在此阶段,您应该不愿意。有Spring MVC framework可以为您做事。

但我建议你从非常基本的开始。从基本的阅读,而不是跳到行话。首先阅读一本关于使用Java开发应用程序的好书。您也可以查看

答案 2 :(得分:0)

如果您愿意,可以在没有框架的情况下实现它们,但是您放弃了框架为您提供的任何好处。

您引用的分层是正确的,独立于任何框架;它只是编程接口和关注点分离。如果你希望尽量减少你想要学习的新技术的数量,你可以在没有Spring的情况下自由地做。

如果你不知道持久性是什么,那么你就不应该跳进Spring。持久性意味着使用SQL将数据存储在大多数人的关系数据库中。如果你不知道,我建议从那里开始。

如果您从未使用过基础技术,那么世界上所有的图书都无济于事。

如果你从来没有做过这些,我建议坚持使用 JSTL(没有scriptlet)直接使用JDBC,servlet和JSP。除此之外的任何事情都会令人困惑。

如果你有一个具有持久性,服务和视图层的Foo模型对象,接口可能如下所示:

package model;

/**
 * A model object that's interesting from your problem's point of view
 */
public class Foo
{
}

package persistence;

/**
 * CRUD operations for a Foo 
 */
public interface FooDao
{
    Foo find(Long id);
    List<Foo> find();
    void saveOrUpdate(Foo foo);
    void delete(Foo foo);
}


package service;

/**
 * Just a data service that wraps FooDao for now, but other use cases would 
 * mean other methods.  The service would also own the data connection and manage 
 * transactions.
 */
public interface FooService
{
    Foo find(Long id);
    List<Foo> find();
    void saveOrUpdate(Foo foo);
    void delete(Foo foo);
}

package view;

/**
 * A class that owns services, validates and binds input from UI, and handles routing 
 * to the next view once service is complete.
 */
public interface FooController
{
   ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);    
}

当然,这些只是界面。您需要提供实施。

答案 3 :(得分:0)

你可以实现所有这些想要 - 它之前已经完成了很多次,但没有什么能阻止你再次这样做。

更好地利用您的时间是为了确保您理解上面列出的关注点(通常是正确的),并确定现有框架的最有效集成(例如,Hiberante,Spring,Guice)等)。对于那个问题有多个答案(并且不缺少意见!),但是在所有条件相同的情况下,您需要整合的框架越少,它就越容易和更好地适应。

Spring 有一个非常着名的框架,涵盖了很多这些东西,所以从那里开始是明智的。它还允许您使用其他框架(即,您可以使用Spring的选择部分)。例如,您可以使用Spring进行依赖注入,并使用不同的MVC框架。

答案 4 :(得分:0)

很难回答这个问题。首先,我不知道你的程序是什么样的。其次,我不认为“转换”它是可以做到的,或者应该做的事情。您所谈论的是开发人员在设计应用程序时通常会想到的架构概念 如果您对这些概念感兴趣,我建议您阅读Model-View-Controller pattern (MVC)service-oriented Architecture (SOA)
这些是不适用于Java的一般概念。但是,它们广泛用于Java企业开发。各种框架允许您使用这些概念创建应用程序。例如,正如其他人所指出的,Spring Web MVC是Spring Framework的一部分,它允许您创建符合MVC模式的Web应用程序。

答案 5 :(得分:0)

如果您的程序非常简单,可以通过为每个程序使用一个calss来完成此分离 类别。

Data Access Layer (read/write data) -> one class for presisting laoding
Service Layer (isolated business logic) -> one calss with bussiness logic
Controller (Link between view and model) -> in simple swing app this merges with UI
Presentation (UI) -> one class for one widnow
dependency injection -> not used in small apps 
program to the interface -> Your service class should use interface tah is used by other class instead of directly your serivce implementation:

如果它不是一个简单的程序,你可能想要为每个类别提供包。

但是 - 不要过度设计!这些概念可以帮助您管理大型应用程序,而不是在您的编程资源中毁掉您!