设计模式在程序中的使用

article/2025/11/6 10:00:40

OO设计的主要目的,在于分割责任,将每个模块的责任降低到合理的程度,并对各个模块进行封装以及降低两个模块之间的耦合度,达到修改一处不影响另外一处的目的。

这个原则其实并不仅仅局限于OO设计,只是OO设计提供了更好的支持。

OO设计的要求:

  • 达到不变更现有代码,仅通过继承以及多态的方式改变系统的行为。
  • 这种设计的优势在于通过派生实现的改变系统行为的方式对原有代码行为不产生任何影响,降低由于增加或改变功能之后引入新的问题的可能性。

核心部分设计思路整理

字符解析流程图

Facade模式

CodecManager的作用类似于Facade
Facade原本的作用是为了给多个不同的包提供一个统一的接口,即使这些不同的包的调用方式不同。

业务逻辑图

相关设计模式

Adaptor

  • 为客户端提供一个统一的接口
  • 通过Adaptor实现从Client访问的统一,每个Adaptor的具体实现所包含的Adaptee的接口可能不统一

在这里插入图片描述

Decorator

  • 通过Component包含ConcreteComponent以及一或多个Decorator,调用Component的行为时,调用ConcreteComponent以及Decorator,实现通过添加以及删除Component包含的Decorator实现Component行为的变化

在这里插入图片描述

Factory Method模式

  • 用于创建一个对象
    • 之所以通过一个工厂方法,而不是直接用new的方式去创建,是为了减低模块相互之间的依赖性
    • 例如在CodecManager中,如果用new GgaCodec()的方式去创建一个codec,那么以后这个codec行为发生变化,我们需要派生一个新的类Gga1Codec的时候,CodecManager中的new也需要相应的变化

在这里插入图片描述

相关模式

抽象工厂

在这里插入图片描述

简单工厂、工厂方法、抽象工厂的比较

下一步的工作

  • 考虑到VDM、VDO语句都有一组多句的情况,实现以下内容
    • 首先,当一组中的总语句数量大于1时,要能够在codec中保存当前语句,而不是马上解析(因为不完整)
    • 其次,每次收到总语句数量大于1的消息时,检查缓存中是否有同组的语句,并检查同组的语句是否足够总语句数量,如果达到总语句数量,解析,并向Observer返回结果,否则保存至缓存
    • 建立一个定时器,定时检查缓存内容
      • 如果缓存中一个语句组中的语句超过一定阀值时间尚未达到总语句数量,则
        • 如果第一句语句存在,则解析从第一句开始的所有连续编号语句的内容
        • 如果第一句不存在,抛弃该语句组不解

设计模式的不同侧重

  • 侧重总体架构的设计模式,如MVC(Java web开发),MVVM(WPF)
  • 侧重细节架构的设计模式,如GoF所描述的23种设计模式
  • 侧重实现的模式,如生产消费队列的同步问题等等

OO设计的主要目的在于封装

  • 对直接的使用者来说,应该成为一个黑盒子,只要给定输入,就能够获取期望的输出
  • 对于期望修改行为的使用者来说,应该不需要关注过多的内部实现,更不需要改动内部的代码来达到修改软件行为的目的
  • 实际的做法其实多种多样,核心的设计,在于控制反转(Inversion of Control,或IoC)
    • 代码例子中的GenericFactory仅仅是一个简单的例子
    • 可以借助其它的IoC库实现类似的效果,比如Spring

Flyweight模式

  • 在编程中,有时会发现创建了大量的同类的对象
  • 对象的创建在Java中是比较耗时的,同时这些对象的回收也会占用较多的资源
    • Java中的对象都是创建在heap上的,这种创建方式决定了内存的分配会比stack上更加耗时
    • Java的垃圾回收机制,会使得整个程序的执行停顿,过于频繁的垃圾回收会对整个程序的响应速度造成严重的影响
  • 尽管在设计及开发中前期阶段,过多的考虑性能优化的方式并不实际也没有必要,但是在设计时的一些考虑还是可以比较有效的提高程序的运行速度
  • Flyweight(拳击术语,蝇量级)就是尽量重复利用已经创建的对象
  • GenericFactory中,将创建的对象进行缓存的方式就是Flyweight模式
  • 这种模式的使用条件是,对同一个对象的复用不会影响处理结果
    • 具体的来说,处理GGA、GLL、RMC语句时,对应的Codec是无状态的,因此使用Flyweight模式不会影响处理结果
    • 对VDM、VDO、ABM、BBM语句来说,因为每个消息都可能有多个语句组成,因此这四种Codec是有状态的,对这四种Codec使用Flyweight模式需要考虑是否合适

Command模式

  • 它尝试以物件来代表实际行动。命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被:
    • 重复多次
    • 取消
    • 取消后重做
  • Command模式的主要意义在于:
    • 将复杂的操作分解,简化了每一个操作的功能,达到了解耦的目的
    • 通过将多个command组合,可以实现复杂的操作,实现command的复用
    • 能够支持command的取消以及重做
  • Command模式是软件设计中常用的设计模式
  • 本项目中,利用command模式将各个NMEA语句的解析分离

在这里插入图片描述


http://chatgpt.dhexx.cn/article/E3xIoRkN.shtml

相关文章

设计模式之命令模式

命令模式 命令模式的定义非命令模式实现:命令模式的实现: 命令模式的定义 说实话这个模式挺令人纠结的,但从这个模式的定义上来看,有点让人摸不到什么头脑,而且查看资料以后会发现还是有点稀里糊涂的,说懂…

《C++ 设计模式》

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 设计模式(Design Pattern)代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处: 可重用代码保…

设计模式课程设计

文章目录 题目要求: 具体作业如下:一、设计思路二、所用模式介绍1.简单工厂模式2.装饰模式3.观察者模式 具体实现过程程序分为三个部分: PS.代码写的比较敷衍,主要是应付作业用,请大家自行斟酌抄袭 又到了一年两度的课程设计时间&…

23种设计模式总结

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢…

设计模式之——桥接模式

设计模式: 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性…

面向对象程序设计

之前复习面向对象的时候整理的,丢出来一起分享一下。因为复习得很赶,只是大致的整理,且大部分图片来自老师的ppt,可能不是很准确。如果要详细了解其中的某个知识点请另外搜索。 但是老师不讲武德啊,明明提纲给了不按提…

MVC设计模式

MVC的全名是Model View Controller,是模型(Model)-视图(view)-控制器(controller)的缩写,是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在…

设计模式考题复习

一.定义 设计模式六大基本原则: 单一职责原则:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;里氏替换原则:能出现子类的地方都应该可以允许父类出现,也就是子类可以扩展父类的…

一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、设计模式是什么? 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应…

设计模式之策略模式详解

设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多&#xff0c…

设计模式——桥接模式

定义 桥接模式(Bridge Pattern),也叫做桥梁模式,结构型设计模式的一种,这个模式相对来说有些难理解。桥接,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥。 …

设计模式23模式介绍

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于,Java基础教程系…

程序设计模式23+1种定义+UML图(有部分分析和联用)

程序设计模式这门课已经学完了,复习的时候做了一个这样的汇总,希望可以给后来学习这门课的同学一些帮助。 设计模式的分类 根据目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavio…

程序员必备的21种“设计模式之道”!

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了重用代码、让代码更容易被他人理解、保证代码可靠性。欢迎小伙伴们收藏关注,持续分享更多优质干货! 设计模式之道 何为设计模式&#xff1f…

Microsoft Office Visio 缺失安装文件的解决方法(附viso安装密钥)

工作环境(蓝色粗体字为特别注意内容) 1,软件环境:Windows 7、Microsoft Office Visio Professional 2007、Microsoft Office Enterprise2007 2,参考文献:https://zhidao.baidu.com/question/1669305667489578747.html 最近在写文…

Microsoft visio 2019 professional 安装

Visio 2019 pro,全程关闭防火墙,运行文件采用管理员运行 Visio 2019 pro 下载jihuo汉化 Visio 2019 pro 下载 从下方链接下载 链接:https://pan.baidu.com/s/1OQXUfOItLJhbKsDf_u3pEQ 提取码:1234 里面包含: 点击V…

Oracle高水位线 HWM降低技巧

作者:IT邦德 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程 (Web\java\Python)工作,主要服务于生产制造 现拥有 Oracle 11g OCP/OCM、 Mysql、Oceanbase(OBCA)认证 分布式TBase\TDSQL数据库、国…

HMM

Author: 李文乐;Email: cocoleYYoutlook.comDatawhale 直观理解 马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德…

hwui简介

简介: hwui主要是android用于2d硬件绘图而加入的一个模块,在hwui之前,android主要是用skia来进行软件绘制,后由于绘制性能等问题,现在android的绘图几乎都是使用了hwui硬件加速绘图。hwui主要则是使用opengles来进行g…

【深度】广告流量分配HWM算法

在广告投放系统中,广告通常分为保量交付广告(Guaranteed Delivery,GD,合约广告)和不保量交付(Non-Guaranteed Delivery,NGD,竞价广告)两种。合约广告是提前签好合约的&am…