模板模式 - 969251639/study GitHub Wiki

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

项目场景:有一个硬件设备,后台服务需要接收这个硬件设备上传的数据,那么后台服务接收到这个数据后需要对数据进行一系列的校验,确保数据的合法性,那么这里可以用模板模式,定好校验的骨架方法,具体的验证交给具体的不同硬件设备去实现

  1. 定义抽象的模板方法
public abstract class ValidateTempate {
    public void check(...) throws ServiceException {
        checkCommomParamRequires(...);//验证必传参数是否有传
        checkToken(...);//验证token的有效性
        checkSignature(...);//验证签名
        checkBody(...);//验证具体子类的私有内容
    }

    //定义必传参数验证,比如token,signature等
    public void checkCommomParamRequires(...) throws CheckException {
        if(... == null) {
            throw new CheckException(...);
        }
        ...
    }

    //验证token
    public void checkToken(...) throws CheckException {
        ...
    }

    //验证签名
    public void checkSignature(...) throws CheckException {
        ...
    }

    //验证具体子类的私有内容,抽象方法,子类实现
    public abstract void checkBody(...) throws CheckException ;
}
  1. 实现具体的模板
//A设备验证
public class ADeviceCheckTemplage extends ValidateTempate {
    //验证具体内容
    @Override
    public void checkBody(...) throws CheckException {
        ...
    }
}

//B设备验证
public class BDeviceCheckTemplage extends ValidateTempate {
    ...
    //验证具体内容
    @Override
    public void checkBody(...) throws CheckException {
        ...
    }
    //验证token,覆盖父类的验证token方法,实现自己的token验证
    @Override
    public void checkToken(...) throws CheckException {
        ...
    }
    ...
}
  1. 使用
//A设备验证
ADeviceCheckTemplage a = new ADeviceCheckTemplage();
a.check(...);
//B设备验证
BDeviceCheckTemplage b = new BDeviceCheckTemplage();
b.check(...);