6. The Service-to-Worker pattern
Service-to-Worker디자인 패턴은 두개의 서브 패턴(Front Controller와View Helper)을 합쳐Micro프레임워크를 만들었다.이 프레임워크의 참여 객체들은 컨트롤러,디스패처,뷰 그리고 헬퍼이다.
구조
|
|
|
역할
n Controller :
요청을 처리하는 시작점이고,중앙화된 요청 처리 단위로‘Dispatcher’를 사용하여 다음 뷰에 권한을 위임한다.또,헬퍼를 사용하여 많은 기능들을 개별 모듈로 분리시킨다.인증,권한 부여 그리고 위임들을 책임진다.
n Dispatcher :
뷰 관리와 네비게이션을 담당한다. ‘Dispatcher’는 다음 뷰에 권한을 위임시킨다. ‘Service-to-Worker’패턴에서‘Dispatcher’는 헬퍼를 사용하여 데이터를 뷰에 보낸다.
n View :
클라이언트에 정보를 보여준다.
n Helper :
뷰나 컨트롤러가 처리를 완성할 수 있도록 도와 준다. ‘Service-to-Worker’패턴에서 데이터를 뷰에 넘겨준다.
n Value Bean :
헬퍼의 다른이름이다.
n Business Service :
클라이언트가 접근하려는 서비스,비즈니스 티어에 접근하는 시작점이다.일반적으로‘비즈니스 위임’이라고 한다.
의도
Front Controller와View Helper패턴을 합쳐 장점만을 가진 프레임워크를 만든다.
결론
패턴들을 결합해 하나의 프레임워크를 만드는 것은 각 패턴과 관련된 장점을 모두이용한다는 점에서 매우 중요하다.
Front Controller패턴과 같이Service-to-Worker패턴은 제어를 중앙화하고,모듈화와 재사용성을 증가시켜 어떤 한 곳에서 시스템 서비스와 여러가지 요청에 대한 비즈니스 로직을 처리할 수 있도록 한다.이것은 뷰에서 프레젠테이션과 관련 없는 로직을 헬퍼 클래스로 분리시켜서 모델과 뷰의 결합도를 감소시킨다.
n 두개의 서브패턴‘Front Controller’와‘View Helper’를 합친것이다.
n 컨트롤러,디스패처,뷰 그리고 뷰 헬퍼로 이루어진다.
n 컨트롤러와 디스패처의 역할이 중요하다.디스페처는 요청 처리,관리 그리고 네이게이션을 중앙 제어한다.
n 뷰는 디스페처가 검색한 데이터의 프레젠테이션을 담당한다.
n 컨트롤러,디스패처,그리고 헬퍼 앞에 로직과 행위를 될수 있는한 많이 넣어 뷰를 가능한 한 간단하게 만든다.
n Push MVC를 사용한다.
예제소스
Class
|
소스
package serviceToWorker; import java.io.Serializable; public class valueBean implements Serializable { private String name; private String email; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } package serviceToWorker; import java.util.ArrayList; public class businessService { private static ArrayList array = new ArrayList(); public businessService() { } public static valueBean[] getMailList() { valueBean[] values = new valueBean[array.size()]; array.toArray(values); return values; } public static void addMail(valueBean value) { array.add(value); } public static void delMail(valueBean value) { for(int i=0; i<array.size(); i++) { if(((valueBean)array.get(i)).getName().equals(value.getName())) array.remove(i); } } } package serviceToWorker; import javax.servlet.http.HttpServletRequest; public class AccountingHelper { public static void getMailList(HttpServletRequest request) { request.setAttribute("accountList",businessService.getMailList()); } public static void addMail(valueBean value) { businessService.addMail(value); } public static void delMail(valueBean value) { businessService.delMail(value); } } package serviceToWorker; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; public interface Command { public String execute(HttpServletRequest helper) throws ServletException, IOException; } package serviceToWorker; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; public class accountAddCommand implements Command { public accountAddCommand() { } public String execute(HttpServletRequest request) throws ServletException, IOException { valueBean value = new valueBean(); value.setName(request.getParameter("name")); value.setEmail(request.getParameter("email")); value.setAge(Integer.parseInt(request.getParameter("age"))); AccountingHelper.addMail(value); accountListCommand listCommand = new accountListCommand(); listCommand.execute(request); return "/view.jsp"; } } package serviceToWorker; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; public class accountListCommand implements Command { public accountListCommand() { } public String execute(HttpServletRequest request) throws ServletException, IOException { AccountingHelper.getMailList(request); return "/view.jsp"; } } package serviceToWorker; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; public class accountRemoveCommand implements Command { public accountRemoveCommand() { } public String execute(HttpServletRequest request) throws ServletException, IOException { valueBean value = new valueBean(); value.setName(request.getParameter("name")); AccountingHelper.delMail(value); accountListCommand listCommand = new accountListCommand(); listCommand.execute(request); return "/view.jsp"; } } package serviceToWorker; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestHelper { private HttpServletRequest request = null; private HttpServletResponse response = null; public RequestHelper(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; } public Command getCommand() { String requestName = request.getServletPath().substring(request.getServletPath().lastIndexOf("/"), request.getServletPath().lastIndexOf(".")); if(requestName.equals("/accountDetail")) return new accountListCommand(); else if(requestName.equals("/accountAdd")) return new accountAddCommand(); else if(requestName.equals("/accountRemove")) return new accountRemoveCommand(); else return null; } } package serviceToWorker; import javax.servlet.*; import javax.servlet.http.*; import java.io.PrintWriter; import java.io.IOException; public class Controller extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=EUC-KR"; public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doProxy(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doProxy(request, response); } protected void doProxy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestHelper helper = new RequestHelper(request, response); Command command = helper.getCommand(); String nextURL = command.execute(request); dispatch(request, response, nextURL); } protected void dispatch(HttpServletRequest request, HttpServletResponse response, String page) throws ServletException, IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page); dispatcher.forward(request, response); } } view.jsp <%@ page contentType="text/html;charset=EUC-KR"%> <% serviceToWorker.valueBean[] values = (serviceToWorker.valueBean[])request.getAttribute("accountList"); int listNum = 0; if(values != null) listNum = values.length; %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Service-To-Worker Pattern</title> <SCRIPT> function reCall(mode) { var ff = document.form; if(mode == 'add') ff.action = '/accountAdd.ctr'; else ff.action = '/accountRemove.ctr'; ff.method = 'post'; ff.submit(); } </SCRIPT> </head> <body> <P> <STRONG><FONT size="6">Service-To-Worker Pattern</FONT></STRONG> </P> <hr/> <P> Total Num(<%=listNum%>) <BR/> <STRONG>Mail List</STRONG> </P> <table cellspacing="2" cellpadding="3" border="1" width="100%"> <tr> <td bgcolor="#cccccc"> <DIV align="center">Name</DIV> </td> <td bgcolor="#cccccc"> <DIV align="center">EMail</DIV> </td> <td bgcolor="#cccccc"> <DIV align="center">Age</DIV> </td> </tr> <% for( int i = 0; i < listNum; i++ ) {%> <tr> <td> <DIV align="left"><%=values[i].getName()%></DIV> </td> <td> <DIV align="left"><%=values[i].getEmail()%></DIV> </td> <td> <DIV align="left"><%=values[i].getAge()%></DIV> </td> </tr> <% } %> </table> <P> </P> <P> <STRONG>Insert & Delete</STRONG> </P> <form name="form"> <table cellspacing="3" cellpadding="2" border="1" width="100%"> <tr> <td width="15%">Name</td> <td width="85%"> <input type="text" name="name"/> </td> </tr> <tr> <td width="15%">EMail</td> <td width="85%"> <input type="text" name="email"/> </td> </tr> <tr> <td width="15%">Age</td> <td width="85%"> <input type="text" name="age"/> </td> </tr> <tr> <td width="15%"> </td> <td width="85%"> <input type="BUTTON" name="addMail" value="Add Mail" omclick="reCall('add');"> <input type="BUTTON" name="delMail" value="Del Mail" omclick="reCall(' </td> </tr> </table> </form> <P> </P> </body> </html>
|
'Programming > Design Pattern' 카테고리의 다른 글
[펌] The Session Façade pattern (0) | 2006.01.21 |
---|---|
[펌] The Message Façade Pattern (0) | 2006.01.21 |
[펌] The Value Object(Transfer Object) pattern (0) | 2006.01.21 |
[펌] The Data Access Object pattern (0) | 2006.01.21 |
[펌] The Dispatcher View pattern (0) | 2006.01.21 |