我正在尝试为我的程序的控制器组件实现一个策略模式。
我有不同的视图状态,比如CreateViewState,您可以在空白画布上创建项目,所以它需要像createInput()、addToModel()和stuff这样的方法。
我拥有的另一个状态是EditViewState,您可以在其中编辑以前添加的项。您选择一个输入,然后更改其颜色或大小或其他任何内容。所以控制器需要的方法是selectInputAtLocation(),或changeColor(java.awt.Color color)或changeSize(int size).
我所要做的就是创建一个IController接口,它有一些常见的方法,如repOK()、toString(),还有一些类似于thisWasTheLocation(int、int )的方法,视图静态调用这些方法来将屏幕上按下的位置传递给控制器。
然而,对于他们的具体工作,我没有他们所拥有的通用方法。我正在考虑在接口中放置一个doStuff(Item item)方法,然后在其中执行控制器逻辑,这样客户机代码就可以在整个代码中使用IController.getInstance().doStuff(item)。就我所能预测的而言,如果我调用它们所拥有的特定方法(changeColor()表示editController,createInput()表示createController),则需要强制转换控制器。
如果我在接口中创建了一个doStuff()方法,那么我需要实现很多If -语句,特别是对于editController (它有超过7-8个方法,我没有提到)。
该如何设计这整个系统?
P.S:Controllers是单子,因此getInstance()
发布于 2011-12-19 09:50:20
从您的描述中很难说出来,但听起来您正在编写自己的MVC框架。为什么不使用Spring、Struts或类似的呢?还不清楚您的域模型有多复杂。
简单地说,你的问题应该如何去设计这整个系统?最好的方法是使用现有的Java框架之一
良好的设计鼓励您将任何棘手的业务逻辑(doStuff())从控制器转移到服务层。您的代码将更容易测试,而不是绑定到控制器。
当您声明控制器需要的方法是selectInputAtLocation(),或changeColor(java.awt.Color颜色)或changeSize(int大小).在我看来,这似乎是在增加不需要的复杂性。
以Struts为例,您的HTTP将包含用户编辑的数据,这对于ActionForm bean中的Controller是可用的。然后,在决定要调用哪个服务方法之前,先验证/清理这些用户数据(类似于您询问的策略模式)。
关于Contoller的设计,您可以让每个域模型类有一个Controller类,如下所示
public class ThingDispatchAction extends DispatchActionSupport {
public ActionForward read( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to read a Thing.java
}
public ActionForward edit( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp )
// call service layer to update a Thing.java
}
public ActionForward create( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to create a new Thing.java
}
public ActionForward save( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to persist a Thing.java
}
public ActionForward delete( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to delete a Thing.java
}
}或者可以为每个域对象拥有多个Controller类,这样每个类中只有一个方法,如下所示
public class ThingReadAction extends ActionSupport {
public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to read a Thing.java
}
}
public class ThingDeleteAction extends ActionSupport {
public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp)
// call service layer to delete a Thing.java
}
}
etc ...选择的MVC框架将具有确定调用哪些方法的配置,等等。
https://stackoverflow.com/questions/8559186
复制相似问题