Command Pattern


-要求をオブジェクト(クラスファイル)としてカプセル化することによって(実行する機能をカプセル化する)、所定の複数の機能を実行するために繰り返し使用可能なクラスを設計する.
-つまり、イベントが発生した場合に実行する機能が多様であるが、イベントが発生したクラスを変更せずに変更する必要がある場合に便利です.
-継承されていないため、メモリの効率が向上します.
  • を実行するメソッド
  • を作成します.
    public void execute() {
    	request.setCharacterEncoding("utf-8");
    		
    	String email = request.getParameter("email");
    	String pw = request.getParameter("pw");
    		
    	memberDTO dto1 = new memberDTO(email, pw);
    	memberDAO dao = new memberDAO();
    	memberDTO dto = dao.Login(dto1);
    		
    	String nextpage = "";
    	if(dto != null) {
    			
    		HttpSession session = request.getSession();
    		session.setAttribute("dto", dto);
    		response.sendRedirect("main.jsp");
    			
    	}else {
    		response.sendRedirect("LoginFalse.jsp");
    			
    	}		
    }
    メソッドでは、コントローラのすべてのコードが切り取られて貼り付けられます.
    →requestとresponseの両方でエラーが発生しました.
    通常のJavaクラスファイルにはrequest/responseはありません.
  • 元コントローラは、ドア内に次のコードを入れるとします.
  • LoginService login = new LoginService();
    login.execute(request, response);
    servletが所有するリクエスト/レスポンスをクラスに貸す.
  • クラスファイルから要求/応答
  • を受信する.
    public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	...
    }
    メソッドカッコでrequestとresponseを受け入れます.
    このときrequest/response部分でランタイムエラーが発生しました
    →メソッドカッコの後ろにthrowsServiceletExceptionとIOExceptionを付ける
    →throws:異常処理
    try-catch:tryは内側部分のみを例外処理した(他の部分は例外ではない).
    throws:メソッド内のコード全体に異常処理の問題が発生します(異常処理を必要としない部分さえ異常処理されます).使いやすいですが、メモリの面では効率がずっと低いです.
    **throwsを使用したくない場合は、各コードにtry-catch文を掛けます.
  • インタフェースを作成します.
  • public interface Command {
    
    	public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
    		
    }
    設計図とも呼ばれます.
    複数人で作成すると、メソッド名、変数名、ファイル名などが変わります.複数の開発者が同時に開発を行う場合,一定のルールを用いて開発を行うことができる.
    **interfaceは機能を定義する領域ではなく、ルールです.カッコはいらない!
  • クラスのファイルを押します.
  • public class LoginService implements Command{
    	...
    }
  • upcasting
  • Command com = null;
    String nextpage = null;
    
    if(command.equals("LoginCon.do")) {
    	com = new LoginService();
    	nextpage = com.execute(request, response);
    }
    子を親に変換する名前
    コントローラのif文をupcastingに変更します.
    すべてのクラスがCommandを実装しているため、Commandcom=null;グローバル変数com=new Loginservice()を設定します.子供を産みながら親に変える.
    **複数のオブジェクトを作成できます.