模板模式與抽象工廠模式的代碼抽取

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

相關文章
相關標籤/搜索