这是方案,
假设我有一个类似的用户类:
public class User{
private String firstName;
private String lastName;
//...
// setter, getters
}
然后我有一个这样的类来处理用户评论:
public class Comments{
// some fields
public static loadComments(User user, int count){...}
}
到目前为止非常基本的东西。但是,我想添加一些帮助程序,以便更容易为用户加载注释。所以我可以在User类中创建一些东西:
final static int defaultCount = 10;
...
public Comment comments(){
return Comments.loadComments(this, defaultCount);
}
我认为这是一种不必传递用户实例的简单方法。但是在这一点上,我很不高兴,因为我已经将我的用户bean对象与加载注释的业务逻辑相结合。我还保存了不属于那里的用户类的默认计数。那么最好的方法是什么?我的目标是将此对象传递给jsp,以便可以调用JSTL函数。我有一个想法,创建一个看起来像这样的UserWrapper ......
public class UserWrapper{
private final static defaultCount = 10;
private final User user;
public UserWrapper(User user){
this.user = user;
}
// should probably cache this but i am not going to show this for simplicity
public Comments getComments(){return Comments.loadComments(user, 10);}
}
我希望我很清楚。我不喜欢使用useBean标签,因为它对于这样的东西不是必需的。我希望有一种更清洁的方式来接近这样的事情!任何帮助将不胜感激!
编辑:有一件事我忘了提及。我希望能够在JSTL中使用此代码。这意味着它必须是一个吸气剂。 DAO模型是众所周知的,但是当我的前端开发人员需要编写scriplet或者我需要将其加载到他可能需要或可能不需要的地方时,它并没有太大帮助。
答案 0 :(得分:3)
从技术独立的立场......
是的,你对这种耦合是禁止的是绝对正确的。查看Layers architectural pattern以提供有关结构业务逻辑和数据的一些指导。例如,设计两个子系统可能是一个很好的主意:一个用于逻辑,另一个用于图层。通过仅限制它们之间的通信,允许逻辑将消息传递到数据层。此外,您可以使用Facade pattern来表示每个子系统,从而进一步降低耦合。将每个图层视为黑框。
另一种可能派上用场的模式是Data Access Object pattern。它将帮助您定义图层之间的合同,以便在必要时传递数据。
答案 1 :(得分:2)
我喜欢使用数据访问对象(DAO)。您的User
和Comment
类将只包含这些对象的字段,然后您创建单独的类以检索有关这些对象的数据。您可以在DAO中包含有关如何检索,更新,选择等的逻辑。例如,
public class UserDAO {
public UserDAO() {
//maybe setup a Hibernate connection or JDBC connection here
}
public User getUser(int userId) {
User user;
//code to retrieve user from datasource
return user;
}
//other methods for update, delete, select, etc
}
public class CommentsDAO {
private static int DEFAULT_COUNT = 10;
public CommentsDAO() {
//maybe setup a Hibernate connection or JDBC connection here
}
public Collection getCommmentsForUserWithCount(User user, int count) {
Collection comments = new Set();
//retrieve comments from datasource limit to count
return comments;
}
public Collection getCommentsForUser(User user) {
return getCommentsForUserWithCount(user, DEFAULT_COUNT);
}
//other methods for update, delete, etc
}