目录
一、介绍
什么是模版方法 1.定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。 因此,在模板方法模式的类结构图中,只有继承关系。 核心设计要点: AbstractClass : 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现 ConcreteClass : 实现实现父类所定义的一个或多个抽象方法。 模版方法应用场景 1.比如聚合支付平台中提交订单支付 模式模式优缺点 1.)优点 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。 2.)缺点 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。 3.)适用场景 在某些类的算法中,用了相同的方法,造成代码的重复。控制子类扩展,子类必须遵守算法规则。
二、示例
package com.example.designmode.demo.template;
import com.example.designmode.dto.OrderDTO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class AbstractPayTemplate {
public String submitOrder(OrderDTO orderDTO) {
//1.参数校验
checkParams(orderDTO);
//2.签名校验
verifySignature(orderDTO);
//3.调用支付接口
String result = pay(orderDTO);
//4.修改订单状态
updateOrder(orderDTO);
return "";
}
protected abstract String pay(OrderDTO orderDTO);
public void updateOrder(OrderDTO orderDTO) {
log.info("updateOrder start,支付方式:{}", orderDTO.getPayType());
}
public void verifySignature(OrderDTO orderDTO) {
log.info("verifySignature start,支付方式:{}", orderDTO.getPayType());
}
public void checkParams(OrderDTO orderDTO) {
log.info("checkParams start,支付方式:{}", orderDTO.getPayType());
}
}
package com.example.designmode.demo.template;
import com.example.designmode.dto.OrderDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class AliPayTemplate extends AbstractPayTemplate {
@Override
protected String pay(OrderDTO orderDTO) {
log.info("支付宝支付开始");
return null;
}
}
package com.example.designmode.demo.template;
import com.example.designmode.dto.OrderDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UnionPayTemplate extends AbstractPayTemplate {
@Override
protected String pay(OrderDTO orderDTO) {
log.info("银联支付开始");
return null;
}
}
package com.example.designmode.demo.template;
import com.example.designmode.dto.OrderDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class WeChatPayTemplate extends AbstractPayTemplate {
@Override
protected String pay(OrderDTO orderDTO) {
log.info("微信支付开始");
return null;
}
}