文档章节

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

jiao1990
 jiao1990
发布于 2016/11/24 11:25
字数 488
阅读 2
收藏 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 控制子类扩展,子类必须遵守算法规则。

 

© 著作权归作者所有

共有 人打赏支持
jiao1990
粉丝 0
博文 6
码字总数 831
作品 0
芜湖
私信 提问
【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

前面我们聊了: 什么是设计模式?你知道多少? 你必须知道的六大设计原则 第一个设计模式,我是皇帝我独苗,单例模式 第二个设计模式,工厂方法模式 第三个设计模式,抽象工厂模式 这个真的很...

微wx笑
2018/05/29
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
2018/03/22
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cnetos7+docker+rancher构建基于DevOps的全自动CI【01】

来自DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量、私有代码库与私有镜像库的应用等。 1、环境选择 安装Rancher环境,一定要在干净的...

Elson
25分钟前
1
0
21分钟教会你分析MaxCompute账单

背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账单基本情况下会第二天6点前产出)...

zhaowei121
29分钟前
0
0
CTO职场解惑指南系列(一)

基于科技能够改变世界的事实,几乎每个公司的程序员都自带闪光灯。程序员的手和普通人的手自然是有区别的,“我们可是用双手改变了世界” 。(码农真的是靠双手吃饭,呵呵) 这个世界上但凡靠...

阿里云云栖社区
33分钟前
3
0
css实现图片自适应容器宽高

css实现图片自适应容器宽高的做法一般如下所示 <style>div{width: 200px; height: 200px}div img{width: 100%; height: 100%}</style><div><img src="xxxx.png" /></div> 当外层容......

小草先森
33分钟前
3
0
PlatON在CentOS上编译部署

本文作者为万向区块链CTO罗荣阁。 目录 PlatON在CentOS上编译部署 1. CentOS 环境准备 1.1. 使用rpm 安装devtoolset-7 1.2. 使用rpm 安装dos2unix 1.3. 准备PlatON代码 1.4. 确保build脚本正...

万向区块链
42分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部