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 控制子類擴展,子類必須遵照算法規則。