模板+策略设计模式介绍及实战

DesignPattern 设计模式学习笔记(面试和工作必备) 最近有很多粉丝留言:“学设计模式有什么用啊,好像我工作中都用不到设计模式,但每次面试都要问实际项目中使用了哪些设计模式,我都答不上来。” 面对这样的问题,我想说设计模式真的很重要。曾经我也认为学设计模式没什么用,但用过了都说好。所以,猿人花了一个星期的时间给大家整理了最常用的设计模式,通过源码和文档的形式分享给大家。 希望大家认真学习掌握,真正学以致用。不仅面试时要对答如流,实际工作中也要加以应用,这样能力才会得到提升。 一、设计模式介绍 设计模式(Design pattern)代表了最佳的实践,通常被有经 阅读详情

模板+策略设计模式介绍及实战

1、设计模式介绍

1.1、模板模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

1.1.1、介绍

**意图:**定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

**主要解决:**一些方法通用,却在每一个子类都重新写了这一方法。

**何时使用:**有一些通用的方法。

**如何解决:**将这些通用算法抽象出来。

**关键代码:**在抽象类实现,其他步骤在子类实现。

应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

**缺点:**每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

**注意事项:**为防止恶意操作,一般模板方法都加上 final 关键词。

1.2、策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

1.2.1、介绍

**意图:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

**主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。

**如何解决:**将这些算法封装成一个一个的类,任意地替换。

**关键代码:**实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

1.3、模板模式和策略模式的区别

  • 模板模式一般只针对一套算法,注重对同一个算法的不同细节进行抽象提供不同的实现。而策略模式注重多套算法多套实现,在算法中间不应该有交集,因此算法和算法只间一般不会有冗余代码!
  • 模板模式从头至尾,各个属性的位置都是固定的,是一个大而全的东西,固定了流程,按照模版来就行。各个抽象方法都是不重复的功能,有的渲染头部,有的选择底部。
  • 策略模式是针对同一个算法,有不同的实现(或多个算法多个实现)。各个策略完成的功能,同一时间,只能选择其中的一种,即互斥的。

2、模板+策略设计模式实战

2.1、业务场景介绍

对接第三方服务服务,一共涉及到6个接口,特点如下:

  • 六个接口路径不一致,
  • 请求方式方法一致,
  • 请求参数字段名称一样,
  • 响应结构体一致,响应内容不一致。

2.2、代码实现

2.2.0、RuleType枚举

/**
 * @Author 
 * @Date 2022/8/21 10:24
 * @Description 类型
 * @Version 1.0
 */
public enum RuleType {

    /**
     * @Author 
     * @Date Created in 17:15 2022/8/21
     * @Description 
     * @Param
     * @return
     **/
    sift,

    /**
     * image
     * @Author 
     * @Date Created in 16:58 2022/8/30
     * @Description
     * @param
     * @return
     **/
    quote,

    /**
     * automate
     * @Author YangYaNan
     * @Date Created in 11:57 2022/8/8
     * @Description
     * @param
     * @return
     **/
    automate;

}

2.2.1、抽象基类BaseRuleType.java

/**
 * @author :
 * @date :Created in 11:21 2022/8/15
 * @description :
 * @version: 1.0
 */
@Service
@Slf4j
public abstract class BaseRuleType {

    @Getter
    public RuleType ruleType;

    @Autowired
    List<BaseRuleApi> baseRuleApis;
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @Autowired
    RuleConfigRepo ruleConfigRepo;
    @Autowired
    QuoteRecordRepo quoteRecordRepo;


    /**
     * handlerRule核心逻辑
     * @Author YangYaNan
     * @Date Created in 19:13 2022/8/15
     * @Description
     * @param ruleDecorator 规则
     * @return void
     **/
    public abstract void handlerRule(IRuleDecorator ruleDecorator);

    /**
     * 解析规则结果
     * @Author 
     * @Date Created in 12:55 2022/8/8
     * @Description 目前使用
     * @param ruleDecorator 规则
     * @return java.lang.String
     **/
    public abstract void analyzeRuleData(IRuleDecorator ruleDecorator);

    /**
     * 挂载和ruleLog日志输出
     * @Author 
     * @Date Created in 14:40 2022/8/17
     * @Description
     * @param quoteProtocol 挂载属主
     * @param ruleDecorator 规则
     * @return void
     **/
    public abstract void mountAndPrintLog(QuoteProtocol quoteProtocol, IRuleDecorator ruleDecorator);

    /**
     * commonHandlerRule公共核心逻辑
     * @Author 
     * @Date Created in 19:13 2022/8/15
     * @Description
     * @param ruleDecorator
     * @return void
     **/
    public void commonHandlerRule(IRuleDecorator ruleDecorator){
        try {
            if (RuleInfoKey.RULE_NOT_GROUPID.equals(ruleDecorator.getRuleGroupId())) {
                log.info("[rule-{}-{}]不调用规则", ruleDecorator.getRuleType().toString(), ruleDecorator.getQuoteProtocol().getBusinessId());
                ruleDecorator.getRuleLog().setCallRule(false);
                return ;
            }
            baseRuleApis
                .stream()
                .filter(api -> api.supportType(ruleDecorator.getRuleType().toString()))
                .findFirst()
                .orElseThrow(() -> new CommonException(PARAMETER_ERROR.getCodeValue(), "暂不支持该类型规则"))
                .callRule(ruleDecorator);
            analyzeRuleData(ruleDecorator);
        }catch (Exception e) {
            log.error("[rule-{}-{}]调用规则异常:{},{}", ruleDecorator.getRuleType().toString(), ruleDecorator.getQuote().getBusinessId(), e.getMessage(), e.getStackTrace());
        }
    }

    void printLog(IRuleDecorator ruleDecorator) {
        ruleDecorator.getRuleLog().setEndAndConsumerTime(System.currentTimeMillis());
        log.info("[rule-{}-{}]ruleLog:{}", ruleDecorator.getRuleType().toString(), ruleDecorator.getQuote().getBusinessId(), CacheUtil.doJacksonSerialize(ruleDecorator.getRuleLog()));
    }

    public long getLongByInteger(Map dataMap, String ruleCoverageCode) {
        return dataMap.containsKey(ruleCoverageCode) ? ((Integer) dataMap.get(ruleCoverageCode)).longValue() : 1L;
    }

    public long getLongByDouble(Map dataMap, String ruleCoverageCode) {
        return dataMap.containsKey(ruleCoverageCode) ? ((Double) dataMap.get(ruleCoverageCode)).longValue() : 1L;
    }

    public double getDoubleByDouble(Map dataMap, String ruleCoverageCode) {
        return dataMap.containsKey(ruleCoverageCode) ? (Double) dataMap.get(ruleCoverageCode) : 1;
    }

    public double getDoubleByInteger(Map dataMap, String ruleCoverageCode) {
        return dataMap.containsKey(ruleCoverageCode) ? ((Integer) dataMap.get(ruleCoverageCode)).longValue() : 1;
    }

    public Object getObjectFromResultData(Map dataMap, String sendforinspectionLevel) {
        return dataMap.containsKey(sendforinspectionLevel) ? dataMap.get(sendforinspectionLevel) : "";
    }

    /**
     *  去掉首位逗号
     * @Author 
     * @Date Created in 16:26 2022/8/1
     * @Description
     * @param str 原字符串
     * @return java.lang.String
     **/
    public String startAndEndCommaRemove(String str) {
        String s = str.startsWith(",") ? str.replaceFirst(",", "") : str;
        return s.endsWith(",") ? s.substring(0, s.length() - 1) : s;
    }

    public boolean isValidNumber(String key) {
        String regx = "^\\d{4,6}$";
        boolean isNumber = Pattern.compile(regx).matcher(key).find();
        return isNumber;
    }

    void addAddActionRuleLog(RuleType.RuleTypeAction action, IRuleDecorator ruleDecorator, String ...changeInfoItems) {
        StringBuilder changeInfo = new StringBuilder();
        for (String s : changeInfoItems) {
            changeInfo.append(s).append("--");
        }
        ruleDecorator.addRuleLog(action.name(), changeInfo.toString());
    }


}

2.2.2、具体SiftType.java实现

/**
 * @author :
 * @date :Created in 11:24 2022/8/15
 * @description :
 * @version: 1.0
 */
@Service(value = "siftType")
@Slf4j
public class SiftType extends BaseRuleType {

    public SiftType(){
        this.ruleType = RuleType.sift;
    }

    @Override
    public void handlerRule(IRuleDecorator ruleDecorator) {
        commonHandlerRule(ruleDecorator);
    }

    /**
     * 解析规则返回data
     * @Author 
     * @Date Created in 11:56 2022/8/23
     * @Description 目前添加险种使用
     * @param ruleDecorator  报价
     * @return
     **/
    @Override
    public void analyzeRuleData(IRuleDecorator ruleDecorator){
        List<Suite> suites = ruleDecorator.getSuites();
        if (ObjectUtils.isEmpty(suites)){
            log.info("[rule-{}-{}]单交强不动态添加险种:{},{}", RuleType.sift.toString(), ruleDecorator.getQuoteProtocol().getBusinessId());
            return;
        }
        if (HttpStatus.HTTP_OK == ruleDecorator.getRuleResponse().getCode()) {
            HashMap<String, Boolean> ruleSupportSuitMap = RuleSupportSuitType.getRuleSupportSuitMap();
            suites.stream().forEach(suite -> { if (ruleSupportSuitMap.containsKey(suite.getCode())) { ruleSupportSuitMap.put(suite.getCode(), true); } });
            addSiftSuites(ruleDecorator, ruleSupportSuitMap);
            removeSiftSuites(ruleDecorator, ruleSupportSuitMap);
            updateSiftSuites(ruleDecorator, ruleSupportSuitMap);
            customizationSiftSuites(ruleDecorator, ruleSupportSuitMap);
        }
    }

    @Override
    public void mountAndPrintLog(QuoteProtocol quoteProtocol, IRuleDecorator ruleDecorator) {
        if (ObjectUtils.isNotEmpty(quoteProtocol.getBaseSuiteInfo()) && ObjectUtils.isNotEmpty(quoteProtocol.getBaseSuiteInfo().getBizSuiteInfo())) {
            quoteProtocol.getBaseSuiteInfo().getBizSuiteInfo().setSuites(ruleDecorator.getSuites());
            quoteProtocol.setSq(ruleDecorator.getSq());
        }
        printLog(ruleDecorator);
    }


    private void addSiftSuites(IRuleDecorator ruleDecorator, Map<String, Boolean> ruleSupportSuitMap) {
        //具体实现
    }

    private void customizationSiftSuites(IRuleDecorator ruleDecorator, Map<String, Boolean> ruleSupportSuitMap) {
        //具体实现
    }



    private void updateSiftSuites(IRuleDecorator ruleDecorator, HashMap<String, Boolean> ruleSupportSuitMap) {
        //具体实现
    }

    private void removeSiftSuites(IRuleDecorator ruleDecorator, HashMap<String, Boolean> ruleSupportSuitMap) {
        //具体实现
    }

}

2.2.3、具体AutomateType.java实现

/**
 * @author :
 * @date :Created in 11:28 2022/8/15
 * @description :
 * @version: 1.0
 */
@Service(value = "automateType")
@Slf4j
public class AutomateType extends BaseRuleType {

    public AutomateType() {
        this.ruleType = RuleType.automate;
    }

    @Override
    public void handlerRule(IRuleDecorator ruleDecorator) {
        commonHandlerRule(ruleDecorator);
    }

    @Override
    public void analyzeRuleData(IRuleDecorator ruleDecorator) {
        RuleResponse ruleResponse = ruleDecorator.getRuleResponse();
        String specialsStr= "";
        if (HttpStatus.HTTP_OK == ruleResponse.getCode()) {
            Map dataMap = ruleResponse.getData();
            specialsStr = dataMap.containsKey(RuleInfoKey.RULE_AUTOMATE_SPECIALLIST) ? dataMap.get(RuleInfoKey.RULE_AUTOMATE_SPECIALLIST).toString() : "";
            addAddActionRuleLog(RuleType.RuleTypeAction.add, ruleDecorator, specialsStr);
        }
        ruleDecorator.setSpecialInfos(specialsStr);
    }

    @Override
    public void mountAndPrintLog(QuoteProtocol quoteProtocol, IRuleDecorator ruleDecorator) {
        printLog(ruleDecorator);
    }


}

2.2.4、面向接口编程

/**
 * @author :YangYaNan
 * @date :Created in 18:20 2022/3/18
 * @description :规则统一service接口
 * @version: 1.0
 */
public interface IRuleManageService {

    /**
     * sift
     * @Author 
     * @Date Created in 17:20 2022/8/21
     * @Description
     * @param quoteProtocol 
     * @return QuoteProtocol
     **/
    QuoteProtocol riskChangeRuleInfo(QuoteProtocol quoteProtocol);
}

2.2.5、策略调用RuleManageServiceImpl.java

/**
 * @author :
 * @date :Created in 18:22 2022/8/18
 * @description :规则统一service层实现类
 * @version: 1.0
 */
@Service
@Slf4j
public class RuleManageServiceImpl implements IRuleManageService {

    @Autowired
    private List<BaseRuleType> baseRuleTypes;

    @Override
    public QuoteProtocol riskChangeRuleInfo(QuoteProtocol quoteProtocol) {
        IRuleDecorator ruleDecorator = new QuoteProtocolDecorator(quoteProtocol, RuleType.sift);
        BaseRuleType baseRuleType = baseRuleTypes.stream()
            .filter(api -> api.ruleType.equals(ruleDecorator.getRuleType()))
            .findFirst()
            .orElseThrow(() -> new CommonException(PARAMETER_ERROR.getCodeValue(), "暂不支持该类型"));
        baseRuleType.handlerRule(ruleDecorator);
        baseRuleType.mountAndPrintLog(quoteProtocol, ruleDecorator);
        return quoteProtocol;
    }
}
真实业务场景使用-模板模式+策略模式组合 模板和策略设计模式一般是使用最频繁的设计模式,模板的场景主要是处理一系列相同的流程,将这些流程放到模板里,每个流程里的处理可能有一些不一样的地方,则可以抽象出一个方法,由每一个有实际意义的子类实现。策略模式:由于总会有不同的实现类,而最终总会要调用实现里,所以用策略模式帮助我们如何调用到实现类里。 阅读详情

相关推荐

Java开发常用的几种设计模式——让代码更“顺溜”的秘籍

Java设计模式实战指南:6大常用模式让代码更高效 本文介绍了Java开发中6种实用设计模式的应用场景和实现方式: 单例模式 - 确保全局唯一实例,适用于配置管理、连接池等场景,通过双重检查锁实现线程安全。 工厂模式 - 封装对象创建逻辑,降低耦合度,适合支付系统等需要创建多种相似对象的场景。 策略模式 - 运行时选择不同算法,使电商促销等业务逻辑更灵活。 代理模式 - 控制对象访问,实现权限校验和日志记录等功能。 观察者模式 - 建立一对多通知机制,适用于微博关注等事件通知场景。 装饰器模式 - 动态扩展

weinichendian的博客 844

【设计模式】模板方法与策略模式的结合使用

模板方法是一种非常简单的设计模式,只要能够理解面向对象中的继承与多态就能够理解这种设计模式,我们可以在很多的框架源码中找到它的身影。同时在我们的日常开发中,它一般是用在同类型且不同实现方式的业务逻辑中,抽取公共逻辑,简单的说就是,模板方法经常和策略模式结合使用。《SpringBoot优雅使用策略模式》本篇文章介绍了什么是模板方法、模板方法的简单实现与在SpringBoot中的实现的。然后对比了模板方法与策略模式的类图,发现两者天然就可以结合在一起使用。最后,通过代码实现验证了两者结合使用的可行性。

积木成林,聚沙成塔 4186

7.java模板模式与8.策略模式示例

NULL 博文链接:https://bingyingao.iteye.com/blog/1264824

Java设计模式之---策略和模板模式介绍

策略模式(Strategy Pattern):在策略模式中,我们定义一组算法,将每个算法都封装起来,使得它们可以互相替换。这样,我们就可以动态地改变对象的行为,而无需改变其接口。

呋喃的博客 829

Python实战:用Py2neo轻松玩转Neo4j图数据库(附完整CRUD示例)

本文通过构建武侠知识图谱的实战案例,详细介绍了如何使用Python的Py2neo库对Neo4j图数据库进行CRUD操作。内容涵盖环境搭建、节点与关系创建、Cypher查询、数据更新删除及事务管理,帮助开发者直观高效地处理复杂关联数据,实现从入门到进阶的完整交互流程。

weixin_29034963的博客 185

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 562

【SpringBoot】策略和模板模式的思考与实践

实现接口的模板抽象类,定义了业务的流程顺序,以及抽象的支付方法。同时也实现了发送短信和邮件的方法,还有一个发送消息的方法。@Slf4j/*** 模板方法:处理业务流程*/@Override// step1 支付if (!result) {return Result.failed("支付失败!");// step2 发送短信和邮件通知到客户// step3 发送用户积分// step4 发送消息return Result.success("处理成功!");// 普通方法。

yuxiangdeming的博客 2166

解决屏幕不亮难题:慷智SerDes DE信号极性配置避坑指南

本文深入探讨了基于慷智AIM95x系列SerDes芯片的嵌入式显示系统开发中,因DE信号极性配置不匹配导致屏幕不亮的典型故障。文章详细解析了DE信号的核心作用与极性定义,提供了慷智SerDes芯片中DE极性寄存器的具体配置方法与调试记录,并给出了从隔离问题、对比时序到波形验证的系统性排查流程,帮助工程师快速定位并解决此类隐蔽问题。

weixin_29185493的博客 145

Java-23种设计模式概述,springmvc实战教程

| 适配器模式 | 将一个类的方法接口转换成客户希望的另外一个接口。(log4j适配logback) | | 桥接模式 | 将抽象部分和它的实现部分分离,使它们都可以独立的变化。 | | 组合模式 | 将对象组合成树形结构以表示“”部分-整体“”的层次结构。 | | 装饰者模式         | 动态的给对象添加新的功能。 | | 外观模式 | 对外提供一个统一的方法,来访问子系统中的一群接口。 | | 享元模式 | 通过共享

m0_60607838的博客 192

思博伦Spirent TestCenter创建单播流uni-stream

Traffic Generator列表中会出现刚才创建的uni-stream,创建完成。通常测试情况下,主要对Ethenet II和IPv4 Header进行配置。(通常情况下,如果流配置比较规范,选择任意端口接收,也没问题。编辑uni-stream基本信息。配置本条流由STC哪个端口接收。

辗转反测的博客 1684

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

weixin_37584728的博客 4740

设计模式学习笔记

tangguanlin2008的博客 443

56、宇宙微波背景辐射(CMB)望远镜及光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统,重点介绍了交叉德拉贡系统的结构特点、偏振测量误差及其控制、以及大型地面望远镜如ACT和SPT的设计与对比。同时,总结了不同光学系统和探测器阵列的优劣势,并展望了未来发展方向,旨在为CMB研究提供更高效的工具和技术支持。

f9g0h的博客 244

3 步上手 MLX-Audio:Apple Silicon 上的极速本地语音合成

在一台 M 系列芯片的 Mac 上,MLX-Audio 让你几分钟内就能离线生成语音、转写录音、克隆音色,全程不依赖云端。这篇新手友好的指南只讲一件事:从 0 跑到第一个能听的语音文件。🚀 ## 60 秒看懂它能做什么 - **它能做什么**:文本转语音(TTS)、语音转文字(STT)、音色克隆,外加去噪、说话人分离、音乐生成等音频处理,全部跑在 Apple Silicon 上。 - **适

gitblog_00989的博客 397

【ACP】2025-最新-疑难题解析- 练习二汇总

全球加速是优化公网访问的,负载均衡是分发流量的,公网 NAT 网关是处理公网 IP 的,高速通道是建私网连接但不直接提供固定私网地址功能。C 是客户端加密方式,D 是 ECS 云盘加密,都不属于 OSS 服务器端加密。某企业想使用云服务器 ECS + 负载均衡 SLB + 弹性伸缩 (Auto Scaling) 的架构搭建一个企业级门户网站,技术负责人对于负载均衡和弹性伸缩配合使用没有经验,于是将他理解的两种产品配合使用的一些技术细节列成了一个表单,并请作为架构师的您帮他做一下鉴别,以下哪些项是正确的?

jundao1997的专栏 297

Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境

本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来!

超级大洋葱的博客 2586

《Java8实战》读书笔记07:Lambda 重构、测试和调试(设计模式实现)

注意:我们重构的目的是让代码更简洁直观,这也是我们要不要把换成的依据。(如果重构后,导致逻辑更绕,阅读成本增加就没必要了。) 可用来简化的废话代码。(比如:核心代码就一句话,为了这一句,以前非得让我实例化一个匿名类再重写方法,太多无用功。) Lambda 是,是。对此保持清醒的认识,关于、的问题就不言自明了。 的根据上下文决定。如果出现,可以类型。例子: (IntelliJ支持这种重构,能自动帮你检查) 8.1.3 从 Lambda 表达式到方法引用的转换 这是一段实现的分组逻辑。将内的业务代码

灵台方寸山斜月三星洞 813

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

实战python设计模式_实战Python设计模式:可复用面向对象软件开发实践

目录第1 章 示例软件介绍 ··········································································· 11.1 准备工作 ············································································ 11.1.1 源代码下载 ··········...

weixin_31995467的博客 208

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Babysitter 求助渠道完整指南:Discord、GitHub Issues 与 Discussions 怎么选才最快

Babysitter 是一款通过确定性、零幻觉的自我编排来管理复杂 AI 代理工作流的项目。当你的编排运行卡住、安装插件失败或遇到报错时,**Babysitter 的求助渠道主要有三个:Discord、GitHub Issues 与 GitHub Discussions**——选对渠道,问题能快一半解决。本文帮你在 1 分钟内判断该去哪里提问,并教你提交一次就能被快速处理的 Bug 报告。 ##

gitblog_00492的博客 972

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

策略模式、模板模式实战

设计模式实战第一讲 本篇从实战代码角度详解策略模式、模板模式这两种设计模式。 简介 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 从某种意义上说:设计模式是前辈总结出来的开发经验,是对面向对象设计中反复出现的问题的解决方案。 结构图 常用的23种设计模式分三类: 除了上面的23种设计模式外,还有一些新的设计模式。如过.

u011385940的专栏 2726

DesignPattern设计模式

本文主要介绍了设计模式相关内容。包括软件设计的SOLID原则,设计模式的分类,单例模式的思想与实现,工厂模式的思想与实现,建造者模式的思想与实现,代理模式的思想与实现,责任链模式的思想与实现等内容。供个人学习使用。

专注Java和MySQL领域知识分享 1885

模板设计模式和策略设计模式(Java)

#上课笔记,仅自己看得懂 两个设计模式: 1)模板设计模式 2)策略设计模式 模板设计模式: /* * 模板设计模式 * * 在父类的一个方法中定义一个总体的算法骨架 * 而将某些步骤延迟到子类中,因为子类的实现细节不同 * * 注意: * 抽象父类提供的模板方法只是定义了一个通用的算法, * 其实先必须依赖子类的辅助 * * * */ abstract clas...

蔡徐坤加入博客园的博客 612

一文整合工厂模式、模板模式、策略模式

其实这几个设计模式我们在平常开发中非常容易使用,也可能你一直在使用就是没有留意而已。

weixin_43741322的博客 3796

怎样才能将模板和策略设计模式结合起来使用

文章目录前言问题在哪里模板设计模式介绍应用实例:优点:缺点:使用场景:注意事项:具体应该怎样做总结 前言 我在之前的文章孔乙己“茴”字四种写法引起我对策略模式实现的思考中留下了一个悬念,文章中的代码实现出现了较多的重复代码块,这样的问题对于一个对代码质量有较高要求的人是不可容忍的。为啥这么说呢?因为这样的不合格的代码,无论是你还是他人进行维护或者更新新的功能,都必将难以下手,终将成为令众人“敬仰”的祖传代码。废话不多说,为了解决这样的问题,我们来引入本文的主角:模板设计模式。 我们先回顾一下前文的内容,

weixin_44137738的博客 1269

UVM设计模式 ( 四 ) 模板模式、策略模式、default_sequence、uvm_callback

上一篇介绍了结构型设计模式:单例模式和工厂模式,接下来介绍行为型设计模式在UVM中的应用。 策略模式

Holden_Liu的博客 5136

设计模式混合篇(策略模式、模板模式、工厂模式、建造者模式)

设计模式是进阶的必修课,需要我们去掌握。

qq_46054356的博客 1659
上一篇: 多线程之ThreadPoolExecutor详解
下一篇: 工厂+模板模式介绍及实战
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白de成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值