设计模式一模板方法模式
Posted 月牙儿June
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式一模板方法模式相关的知识,希望对你有一定的参考价值。
前言
面向对象的三大特点:封装(对象隐藏了数据与具体实现细节)、继承、多态。
设计模式的目的是“重用”,避免重复造轮子。
模式的定义:某一上下文环境中的一类问题 “常用/通用”的解决方法。
每个模式的四个基本要素:模式名称、问题、方法、效果。四个基本要素全面描述了特定的上下文中,相关的类、对象如何协作解决问题。
一、第一个模式——模板方法模式Template Method
1.DRY原则(Don't repeat yourself)
软件开发过程中,时刻发生着变化,如需求变换、技术变换等。 如果我们编写重复的代码,会带来很多问题:
- 在重复的代码中进行相同的修改;
- 开发成本增加,新问题和就问题可能非常相近,只有一些小细节不相同,重复的代码导致无法实现代码的重用,增大工作量;
- 不利于测试;
- 不利于阅读与维护。
package jyy.DesignPattern.template;
//定义一个抽象类作为父类,其中包括一个抽象方法travel(),剩下的两个方法为final类型的方法
public abstract class HappyPeople
public void celebrateSpringFestival()
//确保以下三个函数的执行顺序
subscribeTicket();
travel();
celebrate();
protected final void subscribeTicket()
//......函数方法的具体内容
protected abstract void travel();//抽象函数,等待子类继承这个父类是重写其具体实现,在这里无需定义具体实现
protected final void celebrate()
//.......函数方法的具体内容
package jyy.DesignPattern.template;
public class PassengerByAir extends HappyPeople
@Override
protected void travel()
//实现travel()的具体方法
System.out.println("Traveling by Air");
父类中的方法celebrateSpringFestival()方法是一个模板方法/框架方法,把过年回家分为三步,其中方法travel()是抽象部分,用于方便子类实现不同的功能逻辑。
3.模板方法模式 定义在一个操作中的一个算法框架,把一些步骤推迟到子类中实现。使得子类不需要改变算法结构而重新定义 特定 的算法步骤。 模板方法有如下功能:
- 能够解决冗余问题。上面例子中,避免了重复实现购票、庆祝两个方法
- 易于扩展。如有人坐船回家,直接继承父类并重写travel方法即可
- 父类提供了算法框架,控制方法执行流程,而子类不能改变算法流程。
- 父类可以将重要的、不允许改变的方法屏蔽掉,不让子类重写(override)。可以将这些方法声明为final或者private
定义:一段可执行逻辑的引用,我们把该引用传递到另外一段逻辑里提供适时调用。 目的:避免类的泛滥。 例如:在对数据库的查询操作都是相同的(得到数据库连接Connection对象,创建Statement实例,执行查询语句,返回查询结果并处理异常),只是对 查询结果的处理上不同。但是如果抽象出处理查询结果的方法供子类延迟实现的话,由于各种各样的查询太多,导致我们需要创建很多子类去处理这些查询结果。引起子类的泛滥。因此要用回调来解决此类问题。
代码片段如下:
package jyy.DesignPattern.template;
import java.sql.*;
/**
*定义SimpleJdbcQueryTemplate类为模板方法类
*ResultSetHandler为回调接口
*/
public class SimpleJdbcQueryTemplate
public <T> T query(String queryString,ResultSetHandler<T> rsHandler)
//define variables...
try
Connection connection = getCollection();//获得数据库连接
statement=connection.prepareStatement(queryString)//创建PrepareStatement实例
ResultSet rs=statement.executeQuery();执行查询并返回结果
return rsHandler.handle(rs);//调用回调rsHandlerde handle(ResultSet rs) 方法来处理查询结果并返回
catch (SQLException ex)
//.....
finally
//
ResultSetHandler接口:
import java.sql.ResultSet;
public interface ResultSetHandler<T> //这里使用泛型,这样就没必要每次都写强制类型转换语句了。泛型是在运行时动态得到对象类型的一种能力。
public T handle(ResultSet rs);
执行具体查询时,实现接口,通过query()回调接口。
boolean called=new SimpleJdbcQueryTemplate().query("select * from db" , new ResultSetHandler<Boolean>()
public Boolean handle(ResultSet rs)
//logical to resolve query result...
//return ....
);
以上是关于设计模式一模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章