模板、策略以及工厂模式

(Java)SpringBoot搭建微信公众号后台(二):策略模式+工厂模式处理用户消息 项目中存在大量if-else?不会写设计模式?一文告诉你设计模式有多简单,策略模式+工厂模式解决复杂分支。 阅读详情

模板方法

属于行为设计模式;

在父类中定义一个算法的框架,允许子类在不修改结果的情况下重写算法的特定步骤。

应用场景:当多个产品中的某一功能的处理重复,那么我们可以将重复的流程单独做成类方法(父类),然后针对每个产品继承父类并实现对应方法来适配不同的产品内部执行需求(子类)。

上述爬取不同网站的的数据,但是爬取和提取数据的流程一样,那么我们将重复的流程封装为父类方法,并实现。

好处:如果后续新加入不同产品的相同功能,那么可以直接拿来使用。

测试代码:

/**
注意使用京东类的时候进行了向上转型
*/
@Test
    public void demo(){
        NetMall netMall = new JDNetMall("1000001","*******");
        String base64 = netMall.generateGoodsPoster("https://item.jd.com/100008348542.html");
        log.info("测试结果:{}", base64);
    }

策略模式

属于行为设计模式;

其能让你定义一系列算法并将每种算法分别放入独立的类中,以使算法的对象能够互换;

好处:能够替代大量if-else的利器;

场景:一般是具有同类可替代的行为逻辑算法场景;不同类型的交易方式(信用卡、支付宝、微信)、生成唯一ID策略(UUID、DB自增、DB+Redis、雪花算法、Leaf算法),导航软件(公路路线,步行路线,高速路线)等,都可以使用策略模式进行行为包装,供给外部使用;

其使用的核心点创建一个上下文策略类(策略控制器),并且必须包含一个成员变量来存储对于每种策略的引入:

/**
 * @author xbhog
 * @describe:策略控制器
 * @date 2022/8/21
 */
public class Context <T>{

    private ICouponDiscount<T> couponDiscount;

    public Context(ICouponDiscount<T> couponDiscount) {
        this.couponDiscount = couponDiscount;
    }
    public BigDecimal discountAmount(T couponInfo,BigDecimal skuPrice){
        return couponDiscount.discountAmount(couponInfo,skuPrice);
    }
}

通过构造方法来结构传递来的具体的策略,并调用计算接口。(真的很巧妙!!)上下文策略不负责选择具体的算法,相当于中间站,提供一个小屋来进行交互。

上下文策略使用的好处:上下文可独立于具体策略。这样你就可在不修改上下文代码或其他策略的情况下添加新算法或修改已有算法了。

看下测试(细品):

/**
     * 测试策略模式
     */
@Test
public void Strategy_mj(){
    Context<Map<String, String>> mjActivity = new Context<>(new MJCouponDiscount());
    HashMap<String, String> map = new HashMap<>();
    map.put("x","100");
    map.put("y","10");
    BigDecimal discountAmount = mjActivity.discountAmount(map, new BigDecimal(100));
    log.info("测试结果,满减优惠后的金额:{}",discountAmount);
}
@Test
public void Strategy_zj(){
    Context<Double> context = new Context<>(new ZjCouponDiscount());
    BigDecimal discountAmount = context.discountAmount(9D, new BigDecimal(100));
    log.info("测试结果,直减优惠后的金额:{}",discountAmount);
}
@Test
public void Strategy_zk(){
    Context<Double> context = new Context<>(new ZKCouponDiscount());
    BigDecimal discountAmount = context.discountAmount(0.8D, new BigDecimal(100));
    log.info("测试结果,折扣优惠后的金额:{}",discountAmount);
}
@Test
public void Strategy_nyg(){
    Context<Double> context = new Context<>(new NYGCouponDiscount());
    BigDecimal discountAmount = context.discountAmount(80D, new BigDecimal(100));
    log.info("测试结果,N元购优惠后的金额:{}",discountAmount);
}

工厂方法模式

属于创建型设计模式;

工厂模式在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型;

好处:提供代码的扩展性,减少if-else方法

场景:

  1. 当我们需要替换新的对象时,但是在不同的产品或功能中都引入了,造成修改困难;(简单工厂模式,但功能过多时,会造成过多的if-else)
  2. 当我们需要增加新的对象,比如奖品(兑换卡,实物商品,优惠卷)或者日志框架等类型的场景(工厂方法模式)

工厂方法模式的核心:调整对象创建时的位置,但是需要注意的是,仅当这些产品(兑换卡,实物商品,优惠卷)具有相同的父类或者接口时,子类才能返回不同类型的产品,同时父类中的工厂方法还应将其返回类型声明为这一共有接口(每个产品具有共同的方法);

参考图如下:

细品测试:

/**
     * 工厂模式
     * @throws Exception
     */
    @Test
    public void  test_commodity() throws Exception{
        StoreFactory storeFactory = new StoreFactory();
        ICommodity commodityService = storeFactory.getCommodityService(3);
        commodityService.sendCommodity("10001","AQY1xjkUodl8LO975GdfrYUio",null,null);
    }
    @Test
    public void Test_coupon() throws Exception {
        StoreFactory storeFactory = new StoreFactory();
        ICommodity commodityService = storeFactory.getCommodityService(1);
        commodityService.sendCommodity("10001", "EGM1023938910232121323432", "791098764902132", null);
    }
    @Test
    public void Test_Goods() throws Exception {
        StoreFactory storeFactory = new StoreFactory();
        ICommodity commodityService = storeFactory.getCommodityService(2);
        HashMap<String, String> extMap = new HashMap<>();
        extMap.put("consigneeUserName", "谢飞机");
        extMap.put("consigneeUserPhone", "15200292123");
        extMap.put("consigneeUserAddress", "吉林省.长春市.双阳区.XX街道.檀溪苑小区.#18-2109");
        commodityService.sendCommodity("10001","9820198721311","1023000020112221113",extMap);
    }
策略模式+工厂模式+模板方法模式与spring的结合 一、现在有很多关于策略模式,工厂模式和模板方法的介绍。但是基本都是main方法来展示的,不太清楚怎么移植到自己代码中。这里将其中if else当很多的时候,通过这三种模式与spring结合起来。 这个是当计算商品的价格时候,通过不同会员类型来计算,应该支付的价格的伪代码。可以看到根据三种不同类型,拥有不同折扣。其实看到这个代码,并不算麻烦。如果这一块经常变动,这就会导致这个算法越来越臃肿,进而得到... 阅读详情

相关推荐

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2614

java设计模式之【工厂模式+策略模式】

java设计模式之 策略模式+工厂

weixin_44071800的博客 2290

PCIE6.0协议学习小记-Flit_Mode

PCIE6.0学习

code_aJack的博客 4646

Java设计模式之策略模式+工厂模式+模板模式

【代码】Java设计模式之策略模式+工厂模式+模板模式。

weixin_43051544的博客 423

保姆级教程:在RK3588开发板上驱动多路MIPI摄像头(从VICAP配置到ISP调优)

本文详细介绍了在RK3588开发板上驱动多路MIPI摄像头的完整流程,从VICAP配置到ISP调优的全方位解析。通过硬件架构分析、开发环境搭建、设备树配置、V4L2数据采集以及ISP图像调优等步骤,帮助开发者高效实现多路摄像头驱动,适用于工业检测和智能安防等领域。

weixin_42552315的博客 390

【YOLOv8改进-卷积Conv】 SAConv(Switchable Atrous Convolution):可切换的空洞卷积

许多现代目标检测器通过采用二次观察和思考机制展示了卓越的性能。在本文中,我们在目标检测的主干设计中探索了这一机制。在宏观层面上,我们提出了递归特征金字塔(Recursive Feature Pyramid),该金字塔将特征金字塔网络(Feature Pyramid Networks)的额外反馈连接融入到底层的自下而上主干层中。在微观层面上,我们提出了可切换空洞卷积(Switchable Atrous Convolution),该卷积通过不同的空洞率卷积特征,并使用切换函数汇集结果。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1528

设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

一、工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式,实现方法是定义一个统一创建对象的接口,让其子类自己决定去实例化那个工厂类,解决不同条件下创建不同实例的问题。工厂方法模式在实际使用时会和其他的设计模式一起结合,而不是单独使用。比如在Lottery 项目中奖品的发放就是工厂+模板+策略模式。 1.2 工厂模式实现 举个例子,比

hello_1566的博客 4148

(11-3-01 )

以太坊(Ethereum)是一种基于区块链技术的开源平台和加密货币。它于2015年由Vitalik Buterin和Gavin Wood等开发者创建,并成为比特币之后最受欢迎的加密货币之一。以太坊不仅支持加密货币交易,还为开发者和企业提供了构建去中心化应用程序的强大工具。在本节的内容中,将实型一个完整的机器学习模型项目,智能检测出以太坊区块链中的非法账户。从问题定义到模型建立和评估,再到最终的总结和建议。本实例突出了处理类别不平衡问题的重要性,并展示了如何使用多种机器学习算法来解决实际问题。此外,通过数据可

码农三叔 2171

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

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

weixin_43741322的博客 3796

Open-Sora代码详细解读(2):时空3D VAE

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2054

python实现序列比对之Needleman-wunsch算法 (附完整源码)

python实现序列比对之Needleman-wunsch算法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 464

java策略模式+工厂模式+模板模式

java策略模式+工厂模式+模板模式

gjtao1130的专栏 3531

OD图 arcgis曲线制作插件 od图曲线 路径图曲线制作插件 航线图曲线制作插件

在ArcGIS 10.2 中导入节点数据,打开插件,选择输入起始节点和目标节点的节点文件Point,以Name字段(地名)为连接线的起始字段和目标字段,(Input Table File)选择连接关系表格SDLine.csv,(Origin Column 和 Destination Column)为起始节点和目标节点,(Output Path)为输出路径,应选择.gdb数据库路径,否则容易报错,(Chord Coefficient)为连线的曲率,数值越大,曲率越高。运行环境:ArcGIS10.2。...

JData_Engineer的博客 2670

模板 + 策略 + 工厂模式

在所有的设计模式中,都需要遵循一个原则,就是开闭原则,开闭原则说的是扩展优于修改。

m0_60742341的博客 539

【Davinci开发】:MPU(内存保护)

【Davinci开发】:MPU(内存保护)

2212

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式: 对比简单工厂模式、策略模式和模板模式

代码看这篇:设计模式: 一个简单的策略模式demo 多个Pen接口的实现类 定义工厂类factory根据参数创建Pen实例 客户端通过factory创建的实例去调用具体方法 具体子类和钩子方法具体实现 客户端(Client) 模板方法比较好理解,就是通过抽象类定义模板,通过钩子方法来实现不同的行为。工厂模式和策略模式对比:工厂模式和策略模式区别以及使用

qq_41364834的博客 1846

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

策略模式+模板方法+工厂模式

本文介绍如何通过策略模式、模板方法模式和工厂模式的组合设计,构建一个可扩展的多渠道支付系统。针对电商系统中接入支付宝、微信支付等多种支付渠道的需求,文章分析了各支付方式差异带来的挑战,提出基于设计模式的解决方案:策略模式实现支付算法的灵活切换,模板方法模式抽取公共流程减少重复代码,工厂模式统一管理支付策略的创建。这种组合设计实现了支付系统的高扩展性和易维护性,符合开闭原则,能够在不修改现有代码的情况下新增支付渠道,同时保持清晰的代码结构。

qq_41262225的博客 824

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【混合模式】策略模式+工厂模式+模板方法

Author:Zhu Yuan 航空宇航制造工程 工科男 比昨天的我更强 优快云@weixin_44632389 传统方法:每人都用if和else使代码冗余,而且需求方一旦改变需求,每人都要改动判断条件 策略模式+工厂模式+模板方法:由一人专门负责与需求方沟通和更改条件,把任务模块化并对外提供API,其余人只需要调用API 案例一:条件无返回值 输出接口 public interface Handle { void output(); } 阿斗类 根据需求向工厂内注册条件,把调用方传来的.

weixin_44632389的博客 1287

设计模式: 策略模式+工厂模式+模板模式应用实践

使用策略模式、工厂模式、模板模式对工程代码进行优化

liulianglin的专栏 1866

【设计模式】设计模式原则、单例模式、工厂模式、模板模式、策略模式

设计模式是在软件开发过程中经常遇到的问题的通用解决方案。它们是经过无数的验证和经验积累的最佳实践。首先,设计模式是一些前人经验的一些总结,所以,当遇到相似的问题的时候,我们可以直接借鉴好的设计模式来实现,这样可以大大降低我们的试错成本和迭代成本。可以大大提升我们的开发速度。不要认为只有23种,只要是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结都是软件设计模式的。比如说MVC而且,设计模式都是遵守了很多设计原则的,这些原则可以帮助我们大大提升代码的可重用性、可维护性和可扩展性等。

xueping_wu的博客 1061

记工厂模式,策略模式,模板模式实际使用

最近有一个需求是在一个视频处理项目中对视频使用不同的处理工具进行视频合并,模板合成等操作。之前写了一大堆逻辑在一个类中,使用很多的if语句进行逻辑判断处理,虽然也将代码按功能拆分出了很多的方法,但在一个类中还是显得杂乱冗余,之后如果再添加新的工具或者操作时,也不太好拓展与维护,所以后面研究了下工厂,策略,模板模式,将代码进行了重构,整个代码变得简洁了很多。 先使用策略模式将不同的操作下发到对应的plugin中 定义一个总的plugin接口 AbstractPlugin public interface Ab

m0_37895553的博客 846

设计模式:策略模式、工厂模式、模板模式混合使用

需要根据具体的应用场景和需求来权衡使用策略模式、工厂模式和模板模式的混合。在某些情况下,这种组合可以提供更灵活、可扩展和可维护的设计,但也需要考虑代码复杂性和类的数量增加的影响。

qq_27586963的博客 948

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

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

qq_46054356的博客 1660

策略模式、工厂模式和模板方法模式的使用(JAVA)

策略模式、工厂模式和模板方法模式的使用(JAVA)

这个人很懒,什么都没有留下。 941
上一篇: 解析 FXML 表格的使用,图书列表功能的实现
下一篇: 【JVM】HotspotJVM内存区域解析
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值