设计模式是一套被反复使用,多数人知晓,经过分类编目的,代码设计的总结,也可以说是前人的智慧结晶。学习设计模式能让我们对一些应用场景使用相同的套路达到很好的效果,我会不定时更新一些自己对设计模式的理解的文章,
从定义,实现,应用场景来说说设计模式,今天我要说的对象模板方法模式
一:定义
模板方法模式官方定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式的核心是基于继承的代码复用技术,是结构最为简单的行为型设计模式。
一般模板方法模式中有两个成员
1.抽象父类:定义一些执行步骤,这个步骤可以是具体的,也可以是抽象的,或者简单一点,只是定义一些具体的公用代码。
2.具体子类:如果抽象父类定义的步骤是抽象的,该类就实现这些步骤,如果抽象父类的步骤是具体的,可以直接使用,也可以重写。
二:实现
在笔者做的一个项目中,有一个需求是要和第三方程序进行对接,由于需要对接的接口有多个,每个接口的请求地址不一样,而且每个接口的返回数据不一样需要独立处理,可以把对接的步骤可以分为三个步骤,
首先,需要封装请求的参数,然后,加密数据,发起请求,最后获取结果。
我们分析一下,由于抽象的父类是提取公共的算法步骤或者代码,这里我们可以把加密,发起请求放在抽象父类中,至于具体子类,则实现参数的封装和结果的处理
abstract class AbstractTemplate {
public abstract void packParam();//封装参数
public abstract void disposeResult();//处理返回的结果
public void handle(){//可复用的方法
packParam();
System.out.println("加密,发起第三方请求");
disposeResult();
}
}
class GetUser extends AbstractTemplate{
@Override
public void packParam() {
System.out.println("封装获取用户信息的请求参数");
}
@Override
public void disposeResult() {
System.out.println("获取用户信息,并封装成vo返回");
}
//测试一下
public static void main(String[] add){
new GetUser().handle();
}
}
打印结果:
封装获取用户信息的请求参数
加密,发起第三方请求
获取用户信息,并封装成vo返回
在这种继承的设计模式之中,通常还有一个钩子方法,父类提供一个返回值是布尔类型的方法,默认返回true或者false,通过这个返回值类判断是否要执行该方法,如果想执行,而默认的返回又不是true,
那子类就重新该方法,把返回值改成true,反之亦然,加了钩子方法只会的代码如下
abstract class AbstractTemplate {
public abstract void packParam();//封装参数
public abstract void disposeResult();//处理返回的结果
public void handle(){//可复用的方法
packParam();
hook();//钩子方法
System.out.println("加密,发起第三方请求");
disposeResult();
}
public boolean isNeed(){
return false;
}
public void hook(){
if (!isNeed())return;//不执行
System.out.println("开始执行钩子方法巴拉巴拉。。。。。。。");
}
}
class GetUser extends AbstractTemplate{
@Override
public void packParam() {
System.out.println("封装获取用户信息的请求参数");
}
@Override
public boolean isNeed(){
return true;
}
@Override
public void disposeResult() {
System.out.println("获取用户信息,并封装成vo返回");
}
//测试一下
public static void main(String[] add){
new GetUser().handle();
}
}
打印结果:
封装获取用户信息的请求参数
开始执行钩子方法巴拉巴拉。。。。。。。
加密,发起第三方请求
获取用户信息,并封装成vo返回
三:应用场景
(1) 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即:一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
(2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3) 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。