1.public interface IClassService {
public void doBussness(ProductListVo productListVo);
public void doSirstBussness(ProductListVo productListVo);
public void doFirstBussness(ProductListVo productListVo);
}算法
2.父类app
public abstract class SecondClassService implements IClassService{
//公共代码实现
public void doBussness(ProductListVo productListVo){
doFirstBussness(productListVo);
doSirstBussness(productListVo);
}ide
//不一样业务需求的特俗逻辑
public abstract void doSirstBussness(ProductListVo productListVo);
public abstract void doFirstBussness(ProductListVo productListVo); .net
}设计
3.子类1实现接口
@Service
public class ResClassService extends SecondClassService {get
@Override
public void doSirstBussness(ProductListVo productListVo) {
}
@Override
public void doFirstBussness(ProductListVo productListVo) {
System.out.println(productListVo.getClassBrandParentName()+"ResClassService");io
}event
}模板
4.子类2实现
@Service
public class StockClassService extends SecondClassService{
@Override
public void doSirstBussness(ProductListVo productListVo) {
System.out.println(productListVo.getBrandName()+"StockClassService");
}
@Override
public void doFirstBussness(ProductListVo productListVo) {
System.out.println(productListVo.getClassBrandParentName()+"StockClassService");
}
}
5.模板模式与抽象工厂模式结合
@Service
public class demo implements ApplicationListener<ApplicationEvent> {
private volatile boolean isInstial =true;
private static Map<Integer, SecondClassService> serviceMap = new HashMap<Integer, SecondClassService>(
2);
@Resource
private ResClassService resClassService;
@Resource
private StockClassService stockClassService;
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
if (isInstial) {
// 是否初始化标志
isInstial = false;
// 优惠券使用个数限制 接口登记
serviceMap.put(StaticProperty.PRO_TOP_TYPE_MENPIAO, resClassService);
serviceMap.put(StaticProperty.PRO_TOP_DIY, stockClassService);
}
}
}
public SecondClassService register(Integer id){
return serviceMap.get(id);
}
}
6.业务逻辑 (此处能够继续抽取,一个公用的方法//工厂模式的出口)
@Resource
public demo demo2;
/**
*
* @param request 请求
* @param response 响应
*/
@RequestMapping(value = "/A", method = {RequestMethod.POST, RequestMethod.GET})
public void A(HttpServletRequest request,HttpServletResponse response)
{
ProductListVo productListVo = new ProductListVo();
productListVo.setBrandName("111");
productListVo.setClassBrandParentName("2222");
IClassService register = demo2.register(1);
register.doBussness(productListVo);
IClassService register2 = demo2.register(2);
register2.doBussness(productListVo);
}
5. 模式总结(此处转载)
5.1 优势
5.1.1 模板方法模式经过把不变的行为搬移到超类,去除了子类中的重复代码。
5.1.2 子类实现算法的某些细节,有助于算法的扩展。
5.1.3 经过一个父类调用子类实现的操做,经过子类扩展增长新的行为,符合“开放-封闭原则”。
5.2 缺点
5.2.1 每一个不一样的实现都须要定义一个子类,这会致使类的个数的增长,设计更加抽象。
5.3 适用场景
5.1 在某些类的算法中,用了相同的方法,形成代码的重复。
5.2 控制子类扩展,子类必须遵照算法规则。