HMI的设计模式

设计模式是良好架构的基础。

那么,设计模式的具体概念是什么?

设计模式是一组广为人知、分类整理且经常使用的代码设计经验总结。设计模式用于使代码可复用、易于理解和可靠。

设计模式大致可分为三类,如图所示:

HMI-and-design-patterns-1

在开发HMI时,我们常常会自觉或不自觉地使用以下设计模式:

HMI-and-design-patterns-1

消息交互通常采用观察者模式作为消息机制,由消息驱动整个逻辑流程。

为了考虑程序的封装性,我们会采用多种方式隐藏无需暴露的成员、限制调用范围并降低耦合度。

一些复杂的特殊逻辑可以通过设计模式巧妙地管理,例如状态模式和命令模式。

当然,在人机界面设计过程中还可以使用其他设计模式,这里只是我目前想到的几个例子。

无论采用哪种设计模式,都应遵循以下六项原则:

(1) 单一职责原则。通俗来说,一个类只负责一项职责。为什么这样做?类多一个功能,就多一个变更因素。因此不要给类增加多一个变更理由,使其更稳定且依赖类受影响更小。

(2) 里希特替换原则。通俗来说,里希特替换原则是指子类可以扩展父类的功能,但不能改变父类的功能。它包含以下四个含义:

子类可以添加自己的独特方法。

当子类的方法重载父类的方法时,该方法的先决条件(即方法的参数)比父方法的输入参数更宽松。

当子类的某个方法实现父类的抽象方法时,该方法的后置条件(即方法的返回值)比父类更严格。

(3) 依赖倒置原则。定义:高层模块不应依赖低层模块,两者都应依赖其抽象;抽象不应依赖细节;细节应依赖抽象。一般来说,程序应面向接口。这是非常重要的。我认为这是判断程序是否能处理和维护大型项目的重要标准。当工程代码变得庞大且需求发生变化时,如果你是面向接口编程,就不需要对代码进行大改,只需通过扩展新子类来实现,因为接口不会改变,因此使用该接口的类也不需要改变。

(4) 接口隔离原则。定义:客户端不应依赖其不需要的接口。一个类对另一个类的依赖应基于最小的接口。这样做的目的是减少依赖关系,避免为类更改提供额外理由。

类A通过接口I依赖类B,类C通过接口i依赖类D。如果接口I不是类A和B的最小接口,则类B和D必须实现它们不需要的方法。

解决方案:将臃肿的接口拆分为独立接口,类A和C仅依赖其需要的接口。这就是接口隔离原则。

(5) 迪米特原则。定义:对象应尽可能少地了解其他对象。

问题:类之间的关系越紧密,耦合度越高,当一个类发生变化时,对其他类的影响越大。

解决方案:尽量减少类之间的耦合。

(6) 开闭原则。定义:软件实体(如类、模块或函数)应开放扩展,封闭修改。

为什么这是个问题?

在软件生命周期中,当因变更、升级或维护需要修改原有代码时,可能引入错误到旧代码中,或迫使我们重构整个功能并要求原有代码重新测试。

解决方案:当软件需要变更时,尽量通过扩展软件实体的行为来实现,而非修改现有代码。

如果你在日常设计中注意这些原则,你的代码不会更糟。通过理解常见的设计模式,你的结构将更加合理,团队也更容易开发和维护。关于设计模式的入门,可以参考《设计模式大谈》和《头脑风暴:设计模式》这两本书,但这两本书内容较为浅显,仅适合入门,若需深入研究,建议参考GOF经典著作《设计模式》一书。

    滚动至顶部