Стратегия шаблон полезен, когда у вас есть несколько реализаций (алгоритмов) для данной функции, и вы хотите изменить алгоритм во время выполнения в зависимости от типа параметра.
Один хороший пример из HttpServlet код:
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 & DVDPlayer . Но TV и DVDPlayer будут иметь различную реализацию для этих команд.
Посмотрите на посты с примерами кода:
Пример шаблона стратегии в реальном мире
Использование шаблона проектирования команд