簡體   English   中英

如何在控制器中實施策略模式

[英]How to implement strategy pattern in a controller

我正在嘗試為程序的控制器組件實現策略模式。

我有不同的視圖狀態,例如CreateViewState,您可以在其中創建空白畫布上的項目,因此它需要諸如createInput()addToModel()stuff

我擁有的另一個狀態是EditViewState,您可以在其中編輯先前添加的項目。 您選擇一個輸入,然后更改其顏色或大小或其他內容。 所以控制器需要的方法是selectInputAtLocation() changeColor(java.awt.Color color)changeSize(int size) changeColor(java.awt.Color color)changeSize(int size) ...

解決方法是創建一個IController接口,該接口具有repOK(),toString()等常見方法,還有一些類似this的視圖。到控制器。

但是,為了完成他們的特定工作,我沒有他們擁有的通用方法。 我當時正在考慮在接口中放入doStuff(Item item)方法,然后在其中執行控制器邏輯,以便客戶端代碼可以在整個代碼中使用IController.getInstance().doStuff(item) 據我所能預測的,如果我調用它們具有的特定方法changeColor()對於editController為changeColor createInput()對於createController為createInput() ,則需要轉換控制器。

如果在接口中創建doStuff()方法,則需要實現許多if語句,尤其是對於editController而言(它有7-8個以上我沒有提到的方法)。

如何設計整個系統?

PS: Controllers是單例,因此getInstance()

根據您的描述很難說,但是聽起來您正在編寫自己的MVC框架。 為什么不使用Spring,Struts或類似工具? 尚不清楚您的域模型有多復雜。

簡而言之,您的問題應該如何設計整個系統? 最好通過使用許多現有的Java MVC框架之一來回答

良好的設計鼓勵您將任何棘手的業務邏輯( doStuff() )從控制器中移出並移入服務層。 您的代碼將更易於測試,並且不會與控制器捆綁在一起。

當您聲明So控制器需要的方法是selectInputAtLocation()或changeColor(java.awt.Color color)或changeSize(int size)...時,這聽起來像是您在不需要的地方增加了復雜性。

以Struts為例,您的HTTP表單POST將包含用戶已編輯的數據,並且可在ActionForm Bean中供控制器使用。 然后,您在決定調用哪種Service方法之前(與您要詢問的策略模式類似)驗證/清除此用戶數據。

關於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框架將進行配置以確定要調用的方法,等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM