最新消息

java模版方法模式

设计模式 金牌剑客 1733℃ 0评论

定义

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

UML类图

templateMethod

模版方法角色

抽象模板(Abstract Template):
(1)定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。
(2)定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

具体模板(Concrete Template):
(1)实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
(2)每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

java源代码

AbstractTemplate.java

public abstract class AbstractTemplate {
	public void templateMethod() {
		System.out.println("Before");
		abstractMethod();
		System.out.println("After");
	}
	protected abstract void abstractMethod();
}

ConcreteTemplate.java

public class ConcreteTemplate extends AbstractTemplate {
	@Override
	protected void abstractMethod(){
		System.out.println("ConcreteTemplate");
	}
}

Client.java

public class Client {
	public static void main(String[] args) {
		AbstractTemplate template = new ConcreteTemplate();
		template.templateMethod();
	}
}

模版方法模式在Servlet中的应用

在使用Servlet时需要继承HttpServlet抽象类,在实际调用时会调用service方法。

UML类图

templateMethod_example

service方法的源代码

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);
	}
}

从源代码中可以看出这是一个典型的模板方法模式。

HttpServlet担任抽象模板角色
模板方法:由service()方法担任。
基本方法:由doPost()、doGet()等方法担任。

TestServlet担任具体模板角色
TestServlet置换掉了父类HttpServlet中七个基本方法中的若干个。

转载请注明:QualInfo » java模版方法模式

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址