`
wang吖
  • 浏览: 240051 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java设计模式之模板模式-学习笔记4

 
阅读更多

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

      模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑,每当定义一个新的子类时,不要按照控制流程的思路去想,而应当按照“责任”的思路去想。换言之,应当考虑哪些操作是必须置换掉的,哪些操作是可以置换掉的,以及哪些操作是不可以置换掉的。使用模板模式可以使这些责任变得清晰,下面给出一个追求女孩的模板。

Coding:

1、模板类

 

/**
 * Java设计模式之模板模式
 * 
 * 吖大哥提供了一个文明而向上的追女孩的步骤,具体怎么追怎么才能成功就看你们自己了,健康有效的模板如下
 * 
 * @author 吖大哥
 * @date Jun 3, 2014 9:25:42 AM
 */
public abstract class AbstractTemplet {

	/** 巧遇 */
	public abstract void across();

	/** 约会 */
	public abstract void appointment();

	/** 表白 */
	public void express() {
		System.out.println("喜欢你");
	}

	/** 追求 */
	public abstract boolean pursuit();

	/** 接吻 */
	public abstract boolean kissing();

	/** 上床 */
	public void sleep() {
		boolean flag1 = pursuit();
		boolean flag2 = kissing();
		// 吖大哥建议两步成功之后可以考虑上床
		if (flag1 && flag2) {
			System.out.println("你可以和她上床了…………………………………………");
		} else if (!flag2 || !flag1) {
			System.out.println("你追求或者接吻失败啦,你们不能上床…………………………………………");
		}
	}

	/** 追女孩 */
	public final void chasingGirls() {// 使用final关键字锁定子类只能按如下步骤来追女孩
		across();
		appointment();
		express();
		sleep();
	}
}

2、浪漫的追求者类

 

 

/**
 * 浪漫温馨的追求者
 * 
 * @author 吖大哥
 * @date Jun 3, 2014 10:08:18 AM
 */
public class RomanticGetGirl extends AbstractTemplet {

	@Override
	public void across() {
		System.out.println("无意间的邂逅");
	}

	@Override
	public void appointment() {
		System.out.println("浪漫的约会");
	}

	@Override
	public boolean kissing() {
		System.out.println("深情的接吻");
		return true;
	}

	@Override
	public boolean pursuit() {
		System.out.println("缠绵的追求");
		return true;
	}

}

 3、狂野的追求者类

/**
 * 狂野的追求者
 * 
 * @author 吖大哥
 * @date Jun 3, 2014 10:08:42 AM
 */
public class CrazyGetGirlImpl extends AbstractTemplet {

	@Override
	public void across() {
		System.out.println("疯狂的偶遇");
	}

	/** 表白 */
	public void express() {
		System.out.println("我他妈的贱B嗖嗖的喜欢上你了");
	}

	@Override
	public void appointment() {
		System.out.println("疯狂的找人家约会");
	}

	@Override
	public boolean kissing() {
		return false;
	}

	@Override
	public boolean pursuit() {
		return false;
	}

	public void sleep() {
		System.out.println("咱们直接上床吧………………………………");
	}

}

 4、客户端测试

 

public class Client{

	public static void main(String[] args) {
		AbstractTemplet at1 = new RomanticGetGirl();
		at1.chasingGirls();
		System.out.println("================================");
		AbstractTemplet at2 = new CrazyGetGirlImpl();
		at2.chasingGirls();
	}
}

  5、测试结果:

 

无意间的邂逅
浪漫的约会
喜欢你
缠绵的追求
深情的接吻
你可以和她上床了…………………………………………
================================
疯狂的偶遇
疯狂的找人家约会
我他妈的贱B嗖嗖的喜欢上你了
咱们直接上床吧………………………………

 

 

 

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

  使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫HttpServlet的抽象类。HttpService类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。下面是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);
        }
    }
复制代码

 

  当然,这个service()方法也可以被子类置换掉。

  下面给出一个简单的Servlet例子:

    

  从上面的类图可以看出,TestServlet类是HttpServlet类的子类,并且置换掉了父类的两个方法:doGet()和doPost()。

 

复制代码
public class TestServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        System.out.println("using the GET method");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            
        System.out.println("using the POST method");
    }

}
复制代码

 

  从上面的例子可以看出这是一个典型的模板方法模式。

  HttpServlet担任抽象模板角色

    模板方法:由service()方法担任。

    基本方法:由doPost()、doGet()等方法担任。

  TestServlet担任具体模板角色

    TestServlet置换掉了父类HttpServlet中七个基本方法中的其中两个,分别是doGet()和doPost()。

 

分享到:
评论

相关推荐

    Java 版设计模式学习笔记-java-design-patterns.zip

    以上只是部分Java设计模式的概述,实际的学习笔记中可能还包括这些模式的实现示例、应用场景以及优缺点分析等,这些都是提高软件设计能力的重要资料。通过深入理解和实践这些设计模式,开发者可以编写出更加高效、可...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    Java设计模式学习笔记.pdf

    在学习Java设计模式时,掌握其概念、应用、优点和缺点非常重要。设计模式是软件开发中经常使用的一种通用解决方案模板,用于解决特定上下文中的常见问题。它们源于设计模式的研究,通常被认为是软件设计中的最佳实践...

    根据《JAVA与设计模式》整理的笔记及示例代码

    这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...

    《java学习》-java学习笔记.zip

    设计模式是解决常见编程问题的模板,Java开发者应该熟悉常见的设计模式,如单例、工厂、观察者、装饰器、适配器等。这些模式能够提高代码的可读性、可维护性和复用性。 6. **概念区别(概念区别.md)**: 这个...

    图解Java设计模式笔记总结word版本.rar

    本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...

    java设计模式学习笔记,以及各种模式的代码实现

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。这些模式是面向对象编程中的一种最佳实践,通过标准化的方式处理常见的设计问题。下面...

    《设计模式解析》第2版学习笔记

    ### 《设计模式解析》第2版学习笔记关键知识点总结 #### 第一部分 面向对象软件开发简介 ##### 第一章 面向对象范型 - **面向对象范型概览**: - 本章通过对比结构化程序设计来引入面向对象的概念。 - 强调了...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    java设计模式源码和笔记(第一部分)

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结,能够提升代码的可读性、可维护性和复用性。本资料包“java设计模式源码和笔记(第一部分)”提供了对Java设计模式的深入理解和...

    计算机后端-Java-图解java设计模式笔记.zip

    本压缩包"计算机后端-Java-图解java设计模式笔记"提供了对Java设计模式的深入理解,通过图形化的方式帮助开发者更好地理解和应用这些模式。 1. **单例模式**:保证一个类只有一个实例,并提供一个全局访问点。常见...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    Java最全学习资料+面试题+DOS命令+设计模式+Excel技巧+java学习笔记

    这份压缩包中的资源全面覆盖了Java的学习和应用,包括学习资料、面试题、DOS命令、设计模式以及Excel技巧和Java学习笔记。让我们逐一探讨这些知识点。 1. **Java学习资料**:Java学习资料通常包括基础语法、面向...

    Java入门学习笔记

    "Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...

    java设计模式(收集整理,学习笔记)

    Java设计模式是软件开发中的一种重要思想,它是一种在特定情境下解决常见问题的模板,可以提高代码的可重用性、可维护性和灵活性。在Java中,设计模式主要分为三大类:创建型、结构型和行为型。下面将详细讨论在给定...

    Java基础尚硅谷宋红康学习笔记

    8. **设计模式**:设计模式是解决软件设计中常见问题的通用解决方案,如工厂模式、单例模式、观察者模式、装饰者模式等。 9. **Spring框架**:Spring是Java企业级应用的主流框架,提供依赖注入、AOP、数据访问、Web...

    java学习笔记-html-ssh-js

    【Java学习笔记】 在Java的学习旅程中,深入理解其核心概念是至关重要的。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和稳定性而受到青睐。本笔记集合将带你逐步走进Java的世界,从基础语法到...

    《java学习》-Java 学习笔记.zip

    - **设计模式**:常见的23种设计模式,如单例、工厂、观察者等,是解决特定问题的模板。 - **算法与数据结构**:基础的排序、查找算法,以及链表、树、图等数据结构。 - **网络编程**:TCP/IP协议栈,套接字编程...

Global site tag (gtag.js) - Google Analytics