전략 패턴과 명령 패턴의 차이
Strategy 패턴과 Command 패턴의 차이점은 무엇입니까?자바에서도 몇 가지 예를 찾고 있습니다.
일반적으로 명령어 패턴은 수행되어야 할 작업 및 인수를 로그 기록, 실행 취소 보류, 원격 사이트로 전송 등의 객체로 정리하기 위해 수행되어야 할 작업을 오브젝트로 만들기 위해 사용됩니다.시간이 지남에 따라 시스템의 특정 지점을 통과하는 다수의 개별 명령어개체가 존재하는 경향이 있으며, 명령어개체에는 요청된 작업을 설명하는 다양한 파라미터가 포함됩니다.
반면 Strategy 패턴은 어떤 작업을 수행하는 방법을 지정하기 위해 사용되며 특정 알고리즘을 제공하기 위해 더 큰 개체 또는 메서드에 연결됩니다.정렬 전략은 병합 정렬이거나 삽입 정렬이거나 목록이 최소 크기보다 큰 경우에만 병합 정렬을 사용하는 것과 같은 복잡한 정렬일 수 있습니다.전략 오브젝트는 명령어오브젝트에 관한 대규모 shuffling의 대상이 되는 경우는 거의 없습니다.대신 설정 또는 조정 목적으로 사용됩니다.
두 패턴 모두 독립된 가변성을 제공하기 위해 다른 객체에 포함되었던 원래 클래스 이외의 개별 연산에 대한 코드와 매개 변수를 고려하는 것을 포함합니다.실제 사용 사례와 각 패턴의 배후에 있는 의도에 차이가 있습니다.
말은 이미 정해져 있다.구체적인 코드의 차이는 다음과 같습니다.
public class ConcreteStrategy implements BaseStrategy {
@Override
public void execute(Object argument) {
// Work with passed-in argument.
}
}
public class ConcreteCommand implements BaseCommand {
private Object argument;
public ConcreteCommand(Object argument) {
this.argument = argument;
}
@Override
public void execute() {
// Work with own state.
}
}
전략 - QuickSort 또는 MergeSort [algo 변경]
명령 - 열기 또는 닫기 [액션 변경]
주요 차이점은 명령어가 오브젝트에 대해 몇 가지 액션을 수행한다는 것입니다.오브젝트 상태를 변경할 수 있습니다.
한편, 전략은 오브젝트의 처리 방법을 결정합니다.몇 가지 비즈니스 로직이 캡슐화되어 있습니다.
전략 패턴은 특정 기능에 대해 여러 구현(알고리즘)이 있고 매개 변수 유형에 따라 런타임에 알고리즘을 변경할 때 유용합니다.
Http Servlet 코드의 좋은 예 중 하나는 다음과 같습니다.
service()메서드는 메서드 유형에 따라 사용자의 요구를 doGet() 또는 doPost() 또는 기타 메서드로 전송합니다.
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
전략 패턴의 주요 특징
- 행동 패턴이에요
- 위임을 기반으로 합니다.
- 메서드 동작을 수정하여 객체의 내장을 변경합니다.
- 알고리즘 패밀리를 전환하는데 사용됩니다.
- 런타임에 개체의 동작을 변경합니다.
명령 패턴은 Invoker와 Receiver 간의 느슨한 결합을 활성화하기 위해 사용됩니다.Command, ConcreteCommand, Receiver, Invoker 및 Client가 이 패턴의 주요 구성 요소입니다.
수신자마다 Invoker & Concrete Command를 통해 동일한 명령어를 실행하지만 명령어의 실장은 수신자마다 다릅니다.
예를 들어 TV 및 DVDP 레이어에 대해 "On" 및 "Off" 기능을 구현해야 합니다.단, TV와 DVDPlayer는 이들 명령어의 실장이 다릅니다.
코드 예시와 함께 다음 게시물을 보십시오.
여기서 가장 큰 차이점은 전략 패턴은 같은 인터페이스를 구현하는 다른 오브젝트 간에 셔플할 필요가 있을 때 사용되지만 명령 패턴은 다른 인터페이스를 구현하는 오브젝트 간에 셔플할 때 사용된다는 것입니다(이 오브젝트를 "명령어 오브젝트"라고 불리는 다른 오브젝트로 캡슐화하여 이들 명령어 오브젝트를 전달한다).st 전략 패턴처럼.
언급URL : https://stackoverflow.com/questions/4834979/difference-between-strategy-pattern-and-command-pattern
'programing' 카테고리의 다른 글
| mariadb에서 외부 키를 계단식으로 사용하면 트리거가 활성화됩니까? (0) | 2022.09.25 |
|---|---|
| 현재 디렉토리의 모든 하위 디렉토리 목록 가져오기 (0) | 2022.09.25 |
| JavaScript에서 이메일 주소를 검증하려면 어떻게 해야 합니까? (0) | 2022.09.25 |
| 여러 상속을 가진 부모 클래스 __init__를 호출하는 올바른 방법은 무엇입니까? (0) | 2022.09.25 |
| SQL Chemy는 Django의 get_or_create와 동등한 기능을 가지고 있습니까? (0) | 2022.09.25 |