常用设计模式

Unity 常用设计模式 设计模式 阅读详情

常用设计模式

这篇文章主要是浅谈常用的一些设计模式
1、我们为什么要用设计模式?
业务是变更的,所以需求也是变更的。做软件开发,不变的是变化;这是真理,就像在java中为什么会有interface接口一样。它的存在就是为了隔离变化。使用设计模式也是一样,对我们的代码进行抽象隔离,使代码变得易扩展,易维护。尽量做到需求变更时,我们能少改代码,甚至不改代码。本文章就简单介绍策略模式,工厂模式的结合使用。

策略模式

这基本上是最常用的设计模式之1
有一个经典的场景:双11 、 618 这种促销活动,各种商品有不同的促销活动。什么满减,每满减,数量折扣 2件7折,3件5折 满3件免最低一件等等 这些活动琳琅满目。
后台代码如何实现对应订单的金额计算?一个活动对应的就是一个完整计算订单金额的算法。下面是传统的写法

//计算订单金额的方法,接受一个订单,和一个活动名称,两个参数
public BigDecimal preOrder(Order order,String promotion){
	switch(promotion){
	case "promotion1":
		//活动1订单金额算法
		return  calPromotion1(order);
	case "promotion2":
	   //活动2订单金额算法
	   return  calPromotion2(order);
	case "promotion3":
	   //活动3订单金额算法
	   return  calPromotion3(order);
	...
	}
}

这样写固然能实现业务,但是随着活动的增加,这个类的代码会变得无比臃肿、而且我们要实现无数个calPromotion方法,最后代码爆炸难以维护。
这时候我们就可以采用策略模式,定义一个接口,这个接口只有一个计算订单金额的方法:

//计算订单金额的接口
public interface PromotionCalculation{
	//计算订单金额的方法
	public BigDecimal calculation(Order order);
}
//活动1的订单金额计算方法实现
public class PromotionCalculation1 implements PromotionCalculation{
	//计算订单金额的方法
	public BigDecimal calculation(Order order){
		//具体算法
		return orderPrice;
	}
}

这样我们就完成了根据活动计算订单金额这个行为的抽象,每个一个具体的活动就只需要实现这个接口,在上面的switch里面,我们只需要new PromotionCalculation1对象就能调用对应活动的计算方法。避免了再service类里面写无数个calPromotion方法,避免了类爆炸。service层代码变成了这样

public BigDecimal preOrder(Order order,String promotion){
	switch(promotion){
	case "promotion1":
		//活动1订单金额算法
		return new PromotionCalculation1().calculation(order);
	case "promotion2":
	   //活动2订单金额算法
	   return new PromotionCalculation2().calculation(order);
	case "promotion3":
	   //活动3订单金额算法
	   return  new PromotionCalculation3().calculation(order);
	...
	}
}

工厂模式

还是上面的场景,虽然避免service里面不会再有N个 calPromotion方法,但还是避免不了随着活动的增多,switch里面的代码还是会无限扩展。
这个时候工厂模式就有了用武之地。在次改造代码;工厂工厂,就是生产产品。我们创建的一个工厂类,里面还是只有一个方法,就是创建具体实现订单金额计算接口的实现类对象createPromotionCalculationInstance(),

public class PromotionCalculationFactory{
	//创建具体 根据活动计算订单金额实现类的实例
	PromotionCalculation createPromotionCalculationInstance(String promotion){
			switch(promotion){
			case "promotion1":
				//活动1订单金额算法实现类的实例
			   return  new  PromotionCalculation1();
			case "promotion2":
			   //活动2订单金额算法实现类的实例
			   return  new  PromotionCalculation2();
			case "promotion3":
	   			//活动3订单金额算法实现类的实例
	   		   return  new  PromotionCalculation3();
	...
	}
  }
}

有了上面的工厂,我们的service类里面就变得简单了

public BigDecimal preOrder(Order order,String promotion){
	//根据活动创建 根据活动计算订单金额的具体实现类对象 并调用计算订单金额的方法。
	return new PromotionCalculationFactory()
	.createPromotionCalculationInstance(promotion)
	.calculation(order);
}

到了这里,我们service里面的代码似乎就变得很简洁,就一行就搞定了。再思考,现在还有一个问题,就是工厂类里面,随着活动的增加switch里的代码还是会变得臃肿,这时候我们可以利用数据库来实现。
1、创建一张数据库表,里面存的是一个个活动信息,并将实现类的资源路径作为字段保存起来。类似这种:

idpathname
1com.service.PromotionCalculation1活动1
2com.service.PromotionCalculation2活动2

然后在工厂里面,根据前端传过来promotion字段去数据库查询对应活动信息。再根据资源路径动态的创建实例,工厂改造过后的代码:

public class PromotionCalculationFactory{
	//活动信息dao层
	private PromotionDao promotionDao;
	//创建具体 根据活动计算订单金额实现类的实例
	PromotionCalculation createPromotionCalculationInstance(String promotion){
			//根据promotion查询数据库对应的活动信息
			PromotionEntity promo = PromotionDao.selectByPromotion(promotion);
			//获取活动实现类path
			String path = promo.getPath();
			//加载类对象
			Class cls = Class.forName(path);
			//创建实例并返回
			return (PromotionCalculation) cls.newInstance();
  }
}

这样我们可以只关注活动算法的实现,每次我们新增一个活动,我们只需要实现PromotionCalculation 接口,并把对应实现类的资源路径存到数据库中就可以了,而不再需要改额外的代码。

总结

1.策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换,让算法独立于使用它们的用户而独立变化。

2.工厂模式主要负责实例的创建,工厂模式分为,简单工厂,工厂方法,抽象工厂3种。本文只介绍了简单工厂,感兴趣的朋友可以看看另外两种的写法。

3.设计模式远不止这些,比如装饰者模式,代理模式,责任链模式,桥接模式,适配器模式,外观模式,观察者模式等等。熟练的运用这些设计模式,能极大减少冗余代码。
最后,引用授业恩师一句话:不会偷懒的程序员不是好程序员。多思考,多总结,才能走得更远。

【Aseprite】制作Unity2D瓦片地图素材(平台游戏) 本文章用于记录用Aseprite软件制作2D平台游戏的瓦片地图的方法。 阅读详情

相关推荐

基于Ollama本地大模型的Python自动化翻译工具开发实践

本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。

yhn45678901的博客 560

设计模式使用笔记

基于组合模式与访问者模式完成权限删除功能 类图 代码编写 Priority :节点类,同时有一个执行方法,需要传入一个PriorityOperation接口,这个类在执行的时候可以把自己也传进去 PriorityOperation:具体的逻辑接口类,根据逻辑的不同,可以有多个实现类 /** Priority 构造器 * 接收一个权限树访问者 * @param visitor 权限树访问者 */ public <T> T execute(PriorityOperation<

qq_37114545的博客 368

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9228

java订单抽象设计_Java使用抽象工厂模式实现的肯德基消费案例详解

本文实例讲述了Java使用抽象工厂模式实现的肯德基消费案例。分享给大家供大家参考,具体如下:一、模式定义抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。二、模式举例1 模式分析我们借用爸爸和儿子到肯德基店消费这一场...

weixin_28884205的博客 590

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

【精选】设计模式——策略设计模式-两种举例说明,具体代码实现

策略设计模式是一种行为型设计模式,它允许在运行时选择算法的行为。 在软件开发中,我们常常需要根据不同情况采取不同的行为。通常的做法是使用大量的条件语句来实现这种灵活性,但这会导致代码变得复杂、难以维护和扩展。 策略设计模式通过将每种行为封装到一个独立的类中,并使它们可以相互替换,从而避免了大量的条件判断语句。

guojiaqi_的博客 1578

(三)从零开始学习模糊控制——模糊决策

模糊控制之基础——模糊数学 (一)模糊数学——基本概念 (二)模糊数学——模糊关系 (三)模糊数学——模糊决策 文章目录模糊控制之基础——模糊数学前言一、模糊决策法1.最大值原理2.模糊排序2.模糊寻优总结 前言   模糊决策是指在模糊环境下进行决策的数学理论和方法。这类问题─般具有大系统特征,系统之间的关系十分复杂,存在不能准确赋值的变量,这些变量属于模糊因素,涉及到一定的主观因素,使得子系统之间、变量之间的关系不清晰,从而必须借助排序、模糊评判等方法来进行处理。 一、模糊决策

qq_43667552的博客 4750

【设计模式实践系列】策略模式应用订单折扣方案

策略模式 策略模式指的是一个类的行为或其算法可以在运行时更改,在不同的场景中,有不同的实现算法。 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适

自律使我自由 1069

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 需求:在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 在Unity中经常会用到文本组件的自适应大小功能,一般使用HorizontalLayoutGroup和ContentSizeFitter组件配合即可实现文本自适应的效果。

努力前行,总会成为自己心中的那道光 3万+

【软考】系统集成项目管理工程师(一)信息化知识

软考中级——系统集成项目管理工程师备考干货第一章:信息化知识。

商务合作 | 共同学习 | 携手共进 9万+

设计模式之策略模式

在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。

程序员田同学的博客 473

电磁兼容(EMC)整改案例(七):EFT测试失败都是IC悬空引脚惹的祸

无论任何时候,为了避免这些问题,通常建议对悬空的IO口进行适当的配置,比如设置为强推挽输出低电平、输入带上拉或下拉电阻等,以减少外部电路对IO管脚状态的影响,并提高系统的稳定性和可靠性.

linkking27的博客 1032

Java常用设计模式

最近想简单了解一下设计模式,然后在网上看到了这个专栏,感觉不错,所以转一下 参考:专栏:Java常用设计模式

慎独 317

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

几种常用的设计模式 (Design Pattern)

文章目录设计模式(Design Pattern)一、设计模式的分类1. 基础型模式 (Fundamental Pattern)2. 创建型模式 (Creational Pattern)3. 结构型模式 (Structural Pattern)4. 行为型模式 (Behavioral Pattern)5. 并发型模式 (Concurrency Pattern)二、设计模式详解1.工厂方法模式(Factory Method)应用场景缺点2.策略模式(Strategy Pattern)应用场景缺点3.访问者模式(

zhuyutong202的博客 3061

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

023.常用设计模式

常用设计模式

行者常至 512

常用的设计模式详解

设计模式是后端开发中的“瑞士军刀”,合理运用可显著提升代码质量。单例模式优化资源管理,减少内存开销;观察者模式实现松耦合的事件处理;策略模式支持灵活的算法扩展。开发者需结合实际需求选择模式,避免教条化应用。通过持续实践与反思,设计模式将成为构建健壮后端系统的强大助力。

qq_43038960的博客 1129

常用设计模式详解

本文详细解析了软件开发中常用的设计模式,重点介绍了创建型模式中的单例模式和工厂模式。单例模式通过五种实现方式(饿汉式、懒汉式、双重检查锁、静态内部类、枚举)确保类仅有一个实例,并分析了Spring框架中单例实现的三级缓存机制。工厂模式则通过示例代码展示了工厂方法模式的应用,并说明Spring的IoC容器如何基于工厂模式构建Bean管理体系。文章还涉及这些模式在主流框架如Spring中的实际应用场景,为开发者提供从理论到实践的完整指导。

qq_844085127的博客 3214

【C++】常用设计模式

设计模式是解决软件设计问题的经验总结,合理使用可以提高代码的可维护性、可扩展性和复用性。设计模式(Design Patterns)是软件开发中针对反复出现的问题总结出的通用解决方案。定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者会收到通知并自动更新。将一个类的接口转换成客户希望的另一个接口,使不兼容的类可以一起工作。允许对象在内部状态改变时改变它的行为,看起来像是改变了它的类。将请求的发送和接收解耦,使多个对象都有机会处理这个请求。:对象的创建过程,解耦对象的使用和实例化。

qq_40904479的博客 1296

java面试——讲一下常用的设计模式

​GoF 设计模式:23 种,分为创建型、结构型和行为型三大类。​其他设计模式:随着技术的发展,许多新的设计模式被提出,扩展了设计模式的范畴,以适应不同的开发需求和场景。理解并熟练应用这些设计模式,可以显著提高代码的可维护性、可复用性和灵活性,是每个软件开发人员必备的技能之一。设计模式通常分为三大类:​创建型模式结构型模式和 ​行为型模式。下面我们将详细介绍常用的设计模式。设计模式是软件开发中的最佳实践,不同的设计模式适用于不同的场景。

2401_86405063的博客 1282

七种常用的设计模式

常用的七种设计模式:单例模式、工厂方法模式、抽象工厂模式、代理模式、装饰器模式、观察者模式和责任链模式。设计模式分类设计模式根据工作的目的,分为创建型模式、结构型模式和行为型模式三类。创建型模式:单例模式、工厂方法模式、抽象工厂模式、创建者模式、原型模式。结构型模式:适配器模式、代理模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式。行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。软件设计七大原则(OOP原则)

a154555的博客 8万+

【设计模式】常用的10种设计模式

收录一些自己在开发过程中比较常用的模式,整理出来以便自己梳理和复习,从而熟能生巧,举一反三。下面只列出模式的脉络大纲,取最核心的逻辑进行讲解。

Kard的博客 2274

常用设计模式Java——Design pattern

设计模式 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码复用,增加可维护性 面向对象思想设计原则 单一职责原则 高内聚、低耦合 每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。 开闭原则 核心思想是:一个对象对扩展开放,对修改关闭。 对类的改动是通过增加代码进行的,而不...

pc_zkr的博客 1634

IOS开发-四种常用设计模式

IOS开发-四种常用设计模式

Focus Now 6071

C++ 常用设计模式

本文介绍了C++中12种常用的设计模式,分为创建型、结构型和行为型三大类。创建型模式(如单例、工厂方法、建造者)解决对象创建问题;结构型模式(如适配器、装饰器、代理)优化类组织结构;行为型模式(如观察者、策略、状态)处理对象间协作。文章结合智能驾驶场景示例,展示了各模式的C++实现要点和应用场景,并强调设计原则(开闭原则、依赖倒置等)和选型建议。最后指出应避免滥用模式,优先使用组合而非继承,并善用现代C++特性如智能指针。这些模式是工业级开发的必备工具,理解其核心意图比死记代码更重要。

I Promise的博客 1512

Java常用设计模式大全

单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例, 构造方法必须是私有的、由自己创建⼀个静态变量存储实例,对外提供⼀ 个静态公有方法获取实例优点是内存中只有一个实例,减少了开销,尤其是频繁创建和销毁实例的情况下并且可以避免对资源的多重占用,缺点是没有抽象层,难以扩展,与单一职责原则冲突单例类,只能创建一个实例的类访问类,使用单例类在我们的应⽤程序中我们可能需要将两个不同接口的类来进⾏通信,在不 修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器。

2402_83510798的博客 1100
上一篇: 微服务架构学习-Eureka服务注册中心
下一篇: 2021-08-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值