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语句的解析分离

设计模式在程序中的使用相关推荐

  1. [转]使用设计模式改善程序结构(二)

    使用设计模式改善程序结构(二) 在本系列的 第一篇文章中,描述了如何通过设计模式来指导我们的程序重构过程,并且着重介绍了设计模式意图.动机的重要性.在本文中我们将继续上篇文章进行讨论,这次主要着重于设 ...

  2. [Head First设计模式]山西面馆中的设计模式——装饰者模式

    原文:[Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里 ...

  3. java web里实现 mvc_MVC模式在Java Web应用程序中的实现

    一.MVC简介: MVC架构是一个复杂的架构,其实现也显得非常复杂..Views可以看作一棵树,可以用Composite Pattern来实现.Views和Models之间的关系可以Observer  ...

  4. 程序中保留一个Dump

    这段时间的主要任务是整理代码,有点类似代码考古学,呵呵,所以,看的书与重构和设计模式关系很大了,由于在修订过程中心态是很重要的,所以抽空再看<悟空传>了,否则很难达到一种心态的平衡. 修订 ...

  5. 数据与程序分离——程序中那些表的事儿

    我们先来看一小段程序: const char *GetString(int key) {if (key == 1)return "first";else if (key == 2) ...

  6. 在C#程序中实现插件架构

    原文链接: http://www.cuj.com/documents/s=8209/cujweb0301walcheske/ 原文作者: Shawn Patrick Walcheske 译者: 电子科 ...

  7. 设计模式在vue中的应用(五)

    前言 目录整理: 设计模式在vue中的应用(一) 设计模式在vue中的应用(二) 设计模式在vue中的应用(三) 设计模式在vue中的应用(四) 设计模式在vue中的应用(五) 设计模式在vue中的应 ...

  8. MVC模式 在Java Web应用程序中的实现

    一.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

  9. 利用设计模式替代项目中的if else(转)

    面向过程设计和面向对象设计的主要区别是:是否在业务逻辑层使用冗长的if else判断.如果你还在大量使用if else,当然,界面表现层除外,即使你使用Java/C#这样完全面向对象的语言,也只能说明 ...

最新文章

  1. 属性 visibility
  2. 1/1+2/1+3/2+4/3+...20/19
  3. PyCairo 中的变换
  4. Java学习笔记2.1.3 Java基本语法 - Java关键字与标识符
  5. linux svn删除目录命令,删除目录下的所有.svn版本库目录_CentOS
  6. Android使用拖拽控件来布局界面并展示
  7. win10两台电脑时间同步
  8. 计算机cpu温度显示原理,鲁大师的测温功能是怎么做到的?测温原理介绍
  9. 方舟生存进化怎么自建服务器?方舟生存进化自建服务器教程
  10. 已解决:win11无法连接网络共享打印机的方法
  11. 干货 | Trip.com Android 11 适配之旅
  12. 中文汉字翻译为相应的拼音
  13. 从零开始:AE二次开发中获取A点到B点的最佳路径(3)
  14. ipqc的工作流程图_品质部各人员工作流程图
  15. 我的世界显示服务器领地指令,我的世界服务器领地指令有哪些 指令详细介绍...
  16. 黑苹果安装资源已过期 10.13,10.12
  17. runtime suspend
  18. Hadoop ResourceManager:
  19. 如何搜集一个区域的地铁数据、地质/水文图、卫星/电子图,并整合到ArcGIS中
  20. Internet Download Manager2022中文版免费下载

热门文章

  1. glBlendFunc();的使用
  2. 100M隐藏分区的故事
  3. 保健品推荐一(男性篇)
  4. 网络编程flask一些学习笔记摘抄(一)
  5. Navicat 直接生成 数据库表联系图
  6. sql获取当前时间前后5天、月的方式
  7. 80后IT从业员对幸福的理解
  8. 庆典活动全面展开,网工系列全面预订
  9. android gpu测试,Android下的性能测试
  10. Java基础语法68-抽象类练习