Java设计模式学习——前言与介绍

本文介绍了设计模式的重要性及其在软件开发中的应用,详细阐述了六大设计原则,并对设计模式进行了分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转:http://blog.youkuaiyun.com/xu__cg/article/details/52901464


前言


  在我平时的学习与项目工作中,经常会纠结于类的框架搭建,以及类间的关系梳理,而当我通过查看一些牛人的代码解释时总会有一种有一种豁然开朗之感,感觉别人写的代码层次清晰,易于理解。久而久之,我确实感觉到了设计模式在项目工作中的重要性,所以这段时间我会简单的学习Java中的设计模式,当然深刻的理解设计模式需要有足够的项目经验,目前我只希望大致了解各种设计模式功能,希望在以后的项目中能够使用并加深理解。

什么是设计模式?


模式描述的是我们周围经常重复发生的问题,以及该问题的解决方案的核心。而模式更是一种经验的的积累与总结 , 所以通过模式,我们可以站在巨人的肩膀上去思考问题、解决问题,熟练使用设计模式可以提高我们的工作效率,改善产品质量,最终带来经济效益。因此对于任何想开发出灵活高效、健壮的软件产品的个人或团体,熟练掌握并正确使用设计模式都是必须掌握的基本技能。

设计模式的六大原则


对于设计模式来说,为什么这个模式要这样解决这个问题,而另一个模式要那样,它们背后都遵循的就是永恒的设计原则。 可以说,设计原则是设计模式的灵魂。 
1.单一职责原则(SRP) 
“对于一个类而言,仅有一个能够使它变化的原因”,也就是说不要把原因变化各不相同的职责放在一个类中,而应该 将不同的职责分配给不同的类,使单个类的职责尽量单一,避免类间相互影响。 
例如 :参考下图中的设计,图形计算程序只使用了正方形的 Area() 方法,永远不会使用 Draw() 方法,而它却跟 Draw 方法关联了起来。这违反了单一原则,如果未来因为图形绘制程序导致 Draw() 方法产生了变化,那么就会影响到本来毫不关系的图形计算程序。

那么我们该怎么做呢?如下图,将不同的职责分配给不同的类,使单个类的职责尽量单一,就隔离了变化,这样他们也不会互相影响了

 
2.里氏替换原则(LSP)

“子类型必须能够替换掉它们的基类型。”也就是说继承中的“ IS A ”关系是必须保证的,否则还算什么继承啊!如果违反了 LSP 原则,常会导致在运行时 (RTTI) 的类型判断违反”开放-封闭原则” 。

里氏代换原则是对“开放-封闭”原则的补充。实现“开闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

3.依赖倒置原则(DIP) 
面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

例如 :参考下图的设计,一个开关跟灯直接连接在一起了,也就是说开关依赖于灯的打开和关闭方法,那么如果我想用这个开关也可以打开其他东西呢,比如电视、音响。显然这个设计是无法满足这个要了,因为我们依赖了具体而不是抽象,这个开关已经等价于“灯的开关”。

那么我们该如何来设计一个通用的开关呢?参考下图的设计, OK !现在我们不仅可以打开灯,还可以打开电视和音响,甚至未来任何实现了“开关接口”的任何东西。

4.接口隔离原则(ISP)

每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

例如 :参考下图的设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类的接口方法,那么每个类有可能因为另外两个类的方法 ( 跟自己无关 ) 而被影响。拿取款来说,它根本不关心“存款操作”和“转帐操作”,可是它却要受到这两个方法的变化的影响,真是土鳖!!!

 
那么我们该如何解决这个问题呢?参考下图的设计,为每个类都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,这样就不会互相影响,也就不会在发生土鳖的事情了!

5.迪米特法则(最少知识原则)

一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。 迪米

特法则就要求类“小气”一点,尽量不要对外公布太多的 public 方法和非静态的 public 变量, 尽量内敛, 多使用 private,package-private、protected 等访问权限。 
6.开放封闭原则(OCP)

“软件实体 ( 类、模块、函数等 ) 应该是可以扩展的,但是不可修改。”即 可以随便增加新的类,但是不要修改原来的类

例如 :如下图,有一个客户端程序通过数据访问接口操作数据,对于这套系统来说,一开始计划使用的是 SQL Server 或 Oracle 数据库,但是后来考虑到成本,改用免费的 MySQL ;那么对于客户端程序来说,后来数据的扩展对它没有任何影响,它在不知不觉间就用上了免费好用的 mysql 数据库,这全要感谢 OCP 原则。

设计模式分类

好了简单的介绍了设计原则与设计模式分类,接下来将会逐步介绍各个设计模式。

文章借鉴: http://www.cnblogs.com/justinw/archive/2006/11/28/574573.html



内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值