gpt4 book ai didi

java - 如何在 Controller 中实现策略模式

转载 作者:行者123 更新时间:2023-11-29 09:17:28 25 4
gpt4 key购买 nike

我正在尝试为我的程序的 Controller 组件实现一个策略模式。

我有不同的 View 状态,例如 CreateViewState,您可以在其中在空白 Canvas 上创建项目,因此它需要像 createInput()addToModel()东西

我拥有的另一个状态是 EditViewState,您可以在其中编辑之前添加的项目。您选择一个输入,然后更改其颜色或大小或其他任何内容。所以 Controller 需要的方法是selectInputAtLocation(),或者changeColor(java.awt.Color color)或者changeSize(int size)...

我的方法是创建一个 IController 接口(interface),该接口(interface)具有 repOK()、toString() 等常用方法和一些像 thisWasTheLocation(int x, int y) 这样的 View 静态调用以传递按下位置的方法在屏幕上发送给 Controller 。

然而,对于完成他们的特定工作,我没有他们拥有的通用方法。我正在考虑在界面中放置一个 doStuff(Item item) 方法,然后在其中执行 Controller 逻辑,以便客户端代码可以使用 IController.getInstance().doStuff(item) 在整个代码中。据我预测,如果我调用它们具有的特定方法(changeColor() 用于 editController,createInput() 用于 createController),我将需要转换 Controller 。

如果我在接口(interface)中创建一个 doStuff() 方法,那么我需要实现很多 if 语句,尤其是对于 editController(它有超过 7-8 个我没有的方法提及)。

应该如何设计整个系统?

P.S: Controllers 是单例的,因此 getInstance()

最佳答案

根据您的描述很难说,但听起来您正在编写自己的 MVC 框架。为什么不使用 Spring、Struts 或类似工具?目前尚不清楚您的领域模型有多复杂。

简而言之,您的问题应该如何设计整个系统?最好的答案可能是使用许多现有的 Java MVC 框架之一

良好的设计鼓励您将任何棘手的业务逻辑 (doStuff()) 移出您的 Controller 并移至服务层。您的代码将更易于测试,并且不会绑定(bind)到您的 Controller 。

当你声明 Controller 需要的方法是 selectInputAtLocation() 或 changeColor(java.awt.Color color) 或 changeSize(int size)... 这听起来像是你在不需要的地方增加复杂性。

以 Struts 为例,您的 HTTP 表单 POST 将包含用户已编辑的数据,并且您的 Controller 可以在 ActionForm bean 中使用这些数据。然后,您在决定调用哪种服务方法之前验证/清理此用户数据(类似于您询问的策略模式)。

关于您的 Controller 设计,您可以像这样为每个域模型类设置一个 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 框架将具有配置来确定调用哪些方法等。

关于java - 如何在 Controller 中实现策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8559186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com