设计模式在程序中的使用

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值