首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在控制器中实现策略模式

如何在控制器中实现策略模式
EN

Stack Overflow用户
提问于 2011-12-19 09:17:54
回答 1查看 1.3K关注 0票数 2

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

我有不同的视图状态,比如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()

EN

回答 1

Stack Overflow用户

发布于 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类,如下所示

代码语言:javascript
复制
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类,这样每个类中只有一个方法,如下所示

代码语言:javascript
复制
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框架将具有确定调用哪些方法的配置,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8559186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档