查看原文
其他

【吴坤专栏】如何开发高性能医疗信息系统(程序设计篇之三)

吴坤 HIT专家网官微 2022-11-03
编者按

医疗信息化建设最主要的任务是规划、设计、开发以及部署医疗信息系统。如何开发设计性能良好的医疗信息系统,对于提高医院临床科室的工作效率和医疗信息化工作水平而言至关重要。

在本系列文章中,笔者将围绕“如何开发性能良好的医疗系统软件”这一主题,并结合自身工作经历,分别从软件系统架构设计、程序开发设计、数据库设计开发、项目管理、典型案例等几个方面分享和总结相关经验和教训。


接上篇:【吴坤专栏】如何开发高性能医疗信息系统(程序设计篇之二)

上一篇文章对设计模式相关内容作了简单概述,并对创建型设计模式在医疗软件开发中的应用作了相应介绍。本文将对结构型设计模式在医疗软件开发中的应用做相应介绍。

什么是结构型设计模式?它能解决何种问题?它在软件设计时如何将类或对象按某种布局组成更大的结构?结构型设计模式分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。包括代理、适配器、桥接、装饰、外观、享元、组合等七种设计模式。

代理模式

1.代理模式的定义:由于某些原因需要给某个对象提供一个代理对象以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

2.代理模式结构图

代理类对主体类做了一层封装,外部类要调用访问主体类中的方法,需要通过代理类来实现,不能直接访问主体类。

3.代理模式的优点

  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 代理对象可以扩展目标对象的功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;

4.代理模式的缺点

  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度。

5.代理模式的应用场景

(1)远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,在医院内部的远程文件服务器,用户访问文件服务器时,会建立一个虚拟文件系统连接。在本地打开文件目录时,实际访问的是远程文件服务器。

(2)虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,用户不会感觉到服务器慢。

(3)安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。

(4)智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。

(5)延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。

适配器模式

1.适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

2.适配器模式结构图

从结构图中可以看出,适配器模式实现了一种特殊的场景应用,将适配者类中的方法转换成目标类中所需要的方法。犹如电源适配器一样,在电压等规格不一致时,通过适配器转换成所需要的规格标准。

3.适配器模式的优点

  • 客户端通过适配器可以透明地调用目标接口;
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类;
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

4.适配器模式的缺点

对类适配器来说,更换适配器的实现过程比较复杂。

5.适配器模式应用场景

(1)原有系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

(2)使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

桥接模式

1.桥接模式的定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

2.桥接模式结构图

“抽象”和“实现”分别定义了相应的类,抽象角色类中定义了方法(operation()),而具体方法的实现由实现角色类完成(operationImpl()),实现了“抽象”部分和“实现”部分的分离。

3.桥接模式的优点

  • 由于抽象与实现分离,所以扩展能力强;
  • 其实现细节对客户透明。

4.桥接模式的缺点

由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

5.桥接模式应用场景

(1)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

(2)一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

(3)一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

装饰模式

1.装饰(Decorator)模式的定义:在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

2.装饰模式结构图

上图比较清晰地描述了装饰模式的组成结构,装饰类对构件类中的方法进行了“装饰”,根据不同的需要,可以设计不同的装饰类来对构件类功能进行拓展。

3.装饰模式优点

  • 采用装饰模式扩展对象的功能比采用继承方式更加灵活;
  • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。

4.装饰模式缺点

装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。

5.装饰模式应用场景

(1)需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。

(2)需要通过对现有的一组基本功能进行排列组合而产生非常多的功能,采用继承关系很难实现,而采用装饰模式却能很好地实现。

(3)对象的功能要求可以动态地添加,也可以再动态地撤销。

外观模式

1.外观(Facade)模式的定义:通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

2.外观模式结构图

如图所示,对于不同的子系统类,提供了不同的接口函数,通过设计一个外观角色类,提供统一接口,外部客户类直接调用外观类中的接口方法即可,而不需要知晓各子系统类的各自接口细节。

3.外观模式优点

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类;
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易;
  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他子系统,也不会影响外观对象。

4.外观模式缺点

  • 不能很好地限制客户使用子系统类;
  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

5.外观模式应用场景

(1)对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。

(2)一个复杂系统包含的子系统过多,外观模式可以为系统设计一个简单的接口供外界访问。

(3)客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

享元模式

1.享元模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量,避免大量相似类的开销,从而提高系统资源的利用率。

2.享元模式结构图

非共享角色类以参数额形式传入到共享元类中,另外关键字key属性作为生成享元类的指示,享元工厂根据关键字key以快速复制的方式生成具体享元类。

3.享元模式优点

相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。

4.享元模式缺点

  • 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性;
  • 读取享元模式的外部状态会使得运行时间稍微变长。

5.享元模式的典型应用场景

(1)系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。

(2)大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。

(3)由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式。

组合模式

1.组合模式的定义:组合模式又称作“部分-整体模式”,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

2.组合模式结构图

上图很清晰地描述了组合模式的逻辑结构,其解决的是部分和整体之间的关系,类似于树形结构中“部分-整体”的组成结构问题。

3.组合模式优点

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  • 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。

4.组合模式缺点

  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  • 不容易限制容器中的构件;
  • 不容易用继承的方法来增加构件的新功能。

5.组合模式应用场景

(1)需要表示一个对象整体与部分的层次结构的场合。

(2)要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

结构型设计案例:单点登录

合理运用结构型设计模式,可以设计出结构清晰、功能完善的医疗软件,在此通过一个应用实例:外观模式在单点登录设计上的应用,简单介绍结构型设计模式在医疗软件设计上的应用。

在医疗机构内部,存在很多业务系统:HIS、LIS、RIS等,各个系统数据库结构、程序逻辑不尽相同。用户在使用这些系统时,需要首先登录系统,而各系统的登录逻辑不一样。在实际工作时,用户更希望做到单点登录,即通过一次登录即可使用所有系统,各系统的具体登录过程对用户是透明的。对于这一业务需求,可以通过使用外观模式来实现,如下图所示:

对于HIS、LIS、RIS系统设计相应的类,各类中有登录相应系统的方法。为实现单点登录,设计一个外观登录类Façade,该类中登录方法login()封装了其他系统登录类的登录方法(loginHis()、loginLis()、loginRis()),在程序设计时只要调用外观类中login()方法,即可实现其他所有系统的登录,达到单点登录的效果。

作者简介

吴坤,计算机专业硕士,华中科技大学同济医学院附属同济医院信息中心软件工程师。专业计算机程序员,医疗信息技术推广者,积极参与社会活动,热衷于以信息技术提高医疗行业服务质量和改善患者就医体验。



近期热门文章


HIT专家网∣致力推进中国卫生信息化

想加入HIT专家网专业交流群吗?

请添加“HIT专家网”小助手微信好友

(请务必注明姓名、单位名称、职务、主管技术或产品领域等实名信息)

微信订阅号:HIT180com

微信服务号:chinaHIT

投稿:tan_xiao@hit180.com

商务合作:(010)82373062


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存