模板模式与抽象工厂模式的代码抽取

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 控制子类扩展,子类必须遵照算法规则。

相关文章
相关标签/搜索