【问题标题】:How to implement strategy pattern in a controller如何在控制器中实现策略模式
【发布时间】:2011-12-19 09:17:54
【问题描述】:

我正在尝试为我的程序的控制器组件实现一种策略模式。

我有不同的视图状态,例如 CreateViewState,您可以在其中在空白画布上创建项目,因此它需要像 createInput()addToModel()stuff 这样的方法。

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

我的方法是创建一个 IController 接口,该接口具有常用方法,如 repOK()、toString() 和更多类似 thisWasTheLocation(int x, int y) 的视图静态调用以传递按下的位置到控制器的屏幕上。

但是,对于他们的特定工作,我没有他们拥有的通用方法。我正在考虑在接口中放置一个doStuff(Item item) 方法,然后在其中执行控制器逻辑,以便客户端代码可以在整个代码中使用IController.getInstance().doStuff(item)。据我所知,如果我调用控制器的特定方法(changeColor() 用于 editController,createInput() 用于 createController),我将需要转换控制器。

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

应该如何设计整个系统?

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

【问题讨论】:

  • 我开始尝试再次回答您的问题,但不幸的是,我必须做出太多假设,我不知道您的课程目前正在尝试教给您什么,以及您已经走了多远.如果您可以发布更具体的问题,也许我可以提供进一步的帮助。如果 if 声明有效,则没有任何问题。如果您有一些工作代码要发布,我们可以帮助提出改进建议。

标签: java design-patterns strategy-pattern


【解决方案1】:

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

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

良好的设计鼓励您将任何棘手的业务逻辑 (doStuff()) 从控制器移到服务层。您的代码将更容易测试,并且不会与您的控制器绑定。

当您声明 控制器需要的方法是 selectInputAtLocation()、changeColor(java.awt.Color color) 或 changeSize(int size)...在不需要的地方增加复杂性。

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

关于您的控制器设计,您可以让每个域模型类都有一个控制器类,像这样

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
    }
}

或者你可以为每个域对象有多个控制器类,这样每个类中只有一个方法,如下所示

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 框架将具有确定调用哪些方法等的配置。

【讨论】:

  • 这是一个类的作业,所以我没有使用任何框架,如 Spring 或 Struts。我要做的只是为 MVC 系统的控制器实现一个策略模式,它有做完全不同的事情。
  • 您应该更新您的标签以包含“家庭作业”,以便人们了解您的情况,否则我们假设您遇到了“现实世界”问题。
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多