模板模式与抽象工厂模式的代码抽取
博客专区 > jiao1990 的博客 > 博客详情
模板模式与抽象工厂模式的代码抽取
jiao1990 发表于12个月前
模板模式与抽象工厂模式的代码抽取
  • 发表于 12个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

1.public interface IClassService {
    public void  doBussness(ProductListVo productListVo);
    public  void doSirstBussness(ProductListVo productListVo);
    public  void doFirstBussness(ProductListVo productListVo);
}

2.父类

public abstract class SecondClassService implements IClassService{
    //公共代码实现
    public void  doBussness(ProductListVo productListVo){
        doFirstBussness(productListVo);
        doSirstBussness(productListVo);
    }

   //不同业务需求的特俗逻辑
    public abstract void doSirstBussness(ProductListVo productListVo);
    public abstract void doFirstBussness(ProductListVo productListVo); 

}

3.子类1实现

@Service
public class ResClassService extends SecondClassService {

    @Override
    public void doSirstBussness(ProductListVo productListVo) {
    }
    @Override
    public void doFirstBussness(ProductListVo productListVo) {
        System.out.println(productListVo.getClassBrandParentName()+"ResClassService");

    }

}

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

 

标签: 设计模式
共有 人打赏支持
粉丝 0
博文 6
码字总数 831
×
jiao1990
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: