论文:论软件设计模式的应用
文章目录
- 论文一
- 摘要
- 正文
- 总结
- 论文二
- 摘要
- 正文
- 总结
- 论文三
- 摘要
- 正文
- 总结
论文一
摘要
2022年3月,本人所在公司承担了一项农业系统平台的开发项目,该项目主要是实现农业系统各项内部业务,以及各项农业项目的审批工作,并提供外部用户通过web服务进行信息访问。我在该项目中担任系统架构设计师一职,负责系统的架构设计和软件开发的部分设计工作。本文以该农业系统平台的开发项目为例,主要论述了软件设计模式在该系统开发中的具体应用。在农产品标准化模块中,针对不同的农产品质量指标我们采用了责任链模式;在数据访问中我们采用了工厂模式,以实现对不同数据格式的转换;在验证码生成中我们采用了策略模式,以实现算法的灵活替换。 通过使用这些设计模式,提高了软件的设计质量和开发效率,最终项目顺利上线,并获得用户一致好评。
正文
2022年3月,本人所在公司承担了某市农委系统的系统平台的开发项目,该项目是农业系统的工作平台。不仅承担着农委系统的内部业务工作,包括:生产处、环能处、经管处、农村处、生态处等多个处室。通过实施该系统,可以实现不同处室的业务信息的共享和交流,消除信息孤岛,提高办事效率和质量。另一方面,通过这个平台,可以为农产品加工企业、合作社农户等涉农群体,提供信息公开、在线审批、政策查询、留言信箱、技术推广等农业服务,实现与农产品加工企业、合作社农户等社会群体的网上在线交互,提高服务三农的质量和水平。在该项目中,本人担任系统架构设计师,负责项目的架构设计以及软件开发的部分工作。
由于传统的结构化的软件设计方法不符合面向对象的设计原则,无法很好的实现高内聚和低耦合的要求。模块之间过于紧密,给软件扩展和维护带来很多困难。在这种情况下,设计模式的出现和广泛应用给问题的解决提供了一种有效方法。通过利用设计模式,可以帮助开发者复用已有的设计方法,设计出结构合理、易于复用和可维护的软件,当用户需要发生改变时,可以通过修改少量代码或不修改原有代码即可满足新的需求,增强了系统的可修改性和稳定性,降低系统开发成本。
一般而言,一个设计模式具有模式名称、适应场景、解决方案和效果四个方面的基本要素。设计模式依据其目的可以分为创建型、结构型、行为型三种类型。创建型模式,主要负责对象的创建工作,程序在确定需要创建对象时,可以获得更大的灵活性。常用的创建型设计模式有:单例模式、工厂方法、原型、构造器、抽象工厂等5种模式。结构型模式,负责处理类或对象之间的关系,用于构件结构更加复杂庞大的系统。常用的结构型设计模式有适配器、桥接模式、享元模式、组合模式、外观模式、代理模式等7种模式。行为型模式,主要任务是对类或对象如何交互以及为类和对象分配具体职责进行描述。常用的行为型模式有观察者、状态、策略模式、备忘录、命令、责任链、中介者等11种模式。这些设计方法都是经过反复使用的成熟方法,对优化软件结构,提高软件质量具有重要的指导意义。
在农业信息平台的开发过程中,我们综合使用了多种设计模式,本文着重对责任链模式、工厂方法、策略模式等3种设计模式在该项目中的具体应用进行介绍。
一、责任链模式
我们在信息平台的开发过程中,需要完成对农产品质量进行标准化评选,从低到高评选无公害农产品、绿色产品、有机食品、地理标志认证4种认证,其中,无公害农产品的认定数量较多,标准较低,由农业生产处进行认定。在认定过程中,我们采用了责任链的设计模式。首先,定义了农产品对象fproducts,该对象中保存有农产质量的各项指标,包括水、空气、土壤等环境质量指标,及耕地净化、品种优质高抗、投入品无害化等生产技术。能够全面反映农产品质量水平。其次,我们定义了接口类deal,接口中持有一个农产品对象和自身的接口,以及处理函数processrequest。对外提供对农产品进行分类,并存入不同的信息数据库。随后,我们定义了无公害处理类、绿色食品、有机食品和地理标识4个实现类。对农产品对象fproducts的处理,按照由高到低的顺序,依次进行处理,直到符合某个标准为止,并完成信息处理,将对象信息按照审核的分档标准,存入信息库。通过这个方法,可以实现农产品对象,与处理方法的分离。
二、工厂方法
在农业产业化管理过程中,需要对各区市数据进行采集,由于不同类型的数据导入算法不同,在程序设计过程中,设计者需要定义若干类分别实现导入excel、xml、sqldata等类型的数据的算法,而且用户导入的数据类型存在不确定性,设计者无法确定应该实例化哪一个类。为解决这一问题,我们使用工厂方法模式。首先,定义一个数据访问接口类import。同时,针对不同的数据类型,还定义了ImportExcel、ImprotXML、ImportSQLDATA具体产品类,实现了import所声明的公共接口,其主要功能是封装了不同类型的数据导入到数据库的具体算法。Importcreator是抽象工厂类,持有一个接口产品类import的对象。Importexcelcreator、importXMLCreator、importSQLdata是具体工程类,主要功能是生产具体产品实体,直接在客户端的调用下创建产品实例。通过工厂方法模式的引入,可以有效解决客户需要变化对设计的影响,设计者无需知道那个子类被实例化,子类会根据具体情况自己决定实例化哪一个类,而且创建具体产品的细节也有着很好的封装,符合高内聚、低耦合的设计和原则。当需要在系统中添加新的产品时,也不需要修改抽象工厂和抽象产品的接口,以及其他具体工厂和具体产品,具有很好的的可扩展性。
三、策略模式
在系统的安全性方面,我们采用了用户名—密码—自动验证码相结合的办法,以保证系统访问安全性。根据验证码的使用环境,一般分为数字验证码、汉字验证码、英文验证码3种类型。而生成不同类型验证码的算法存在巨大差异,为此需要定义不同的生成验证码的算法。为解决此问题,可以利用策略模式将不同的算法封装起来,并使他们可以相互替换,使得算法独立于使用它的客户而变化。在设计策略模式中,我们定义了3个角色。环境角色:持有一个抽象策略角色
StrategyVerifyCode接口的引用,并通过StrategyVerifyCode接口,来实现一个具体的策略算法。抽象策略角色:定义所有的具体策略类所需的统一访问接口;具体策略角色:包装了相关的算法或行为;在该项目中,我们按照数字、文字、字符3种类型,分别定义了shuzi_verify、zifu_verify、wenzi_verify3个具体的策略类。通过使用策略算法,将生成验证码的算法封装在一个个独立的策略类中,用户可以根据自己的需求从不同策略中进行选择,有效的避免了使用条件转移语句不易维护的缺点。而且策略模式利用组合代替继承,将算法的实现与算法的选择分离开来,降低了程序之间的耦合度,增强了代码的可扩展性和可维护性。
总结
以上设计模式的选用基本达到了预期的效果。首先是,这些设计模式都是一些常用的设计方法,在架构设计师、系统分析师、开发人员之间,形成了良好的沟通桥梁,大家很容易进行交流和沟通。其次,在使用设计模式过程中,软件的开发效率较高,能够节省开发成本。最重要的是,这些模式都是一些经过反复使用的成熟设计方案,符合面向对象中设计规范,比如:面向接口编程、里氏替换原则、单一职责原则、依赖倒转等设计原则,最大限度的提高软件的标准化,为日后的系统维护打下了很好的基础。
当然,我们在设计过程中,也存在一些问题和不足,不少开发人员在设计过程中,有时还是习惯于原有的设计方法,对模式的使用有些抵触。而且,这些设计模式在应用过程中,往往不是单独使用,需要对多个模式进行综合运用。这方面,我们还缺少相关的经验。所以,在以后的项目设计中,我们将继续应用各种设计模式,做到融会贯通,不拘一格的目标,争取能设计出更多的高质量软件项目。
论文二
摘要
2019年10月,本人所在保险公司启动了超级销售APP项目,该项目通过运用先进的销售工具、客户管理、营销活动管理等功能以达到提升销售人员的效能,加大业务驱动的目标。在该项目中我担任系统架构师,负责系统的架构设计工作。本文以该项目为例,主要论述了软件设计模式在开发中的具体应用。
通过抽象工厂模式,实现出单流程车+人联合销售模块间的对象解耦,符合设计模式迪米特法则。通过外观模式,实现保费支付实名认证生物识别、手机号校验隐藏系统的复杂性,系统中的接口提供一致的界面。通过策略模式,实现客户营销基于大数据客户画像,达到不同活动方案可以自由切换。设计模式提高系统的可复用性、扩展性和开放性。基于以上技术应用,项目成功上线,获得用户一致好评。
正文
本人所在的保险公司分支机构遍布全国,已经设立分公司36家,机构总数超过2100家,营业机构覆盖全国各个省份,系统员工人数超6万人。因保险生态体系的变革,各保险公司都在积极科技转型,公司基于新业态发展通过"线上化、数字化、智能化"加速推进"三新三聚焦"的战略转型。故启动了超级销售APP项目建设,本项目旨在建设业界领先的面向销售的、具有前瞻性和可扩展性的,符合主流技术的保险销售一体化平台,聚集核心作业功能,体现支持、服务、提效和赋能。系统主要实现功能车险、非车险出单、业绩管理、客户管理、营销活动、商业计划书、续保管理等。通过两个视角挖掘,营销员视角,集获客、展业、服务、个人成长为一体,作业辅导始终伴随的创新工作模式、挖掘潜在销售机会,提高工作效率,促进职业能力发展。管理视角,综合管理招募、培训、业绩、活动、提供营销指导和线索及客户服务锦囊,降低消息传递成本、提升营销员团队整体产能和绩效。
该项目于2019年10月正式启动,我担任系统架构设计师角色,负责系统总体架构设计工作。在系统实现过程中,通过面向对象的分析和设计方案,达到了系统的可复用性和扩展性。设计模式代表了最佳的实践,是开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案经过相当长的一段时间的实验和错误总结出来的。在面向对象的软件设计过程中,为了使系统体系架构更加精巧灵活,针对特定问题采用的简洁而易于理解的解决方案。经典的软件设计模式按目的不同可以分为三大类:创建型模式、结构型模型和行为型模式。第一类创建型模式,包含工厂方法、抽象工厂、构建器、原型和单例五种模式,提供在创建对象的同时隐藏创建逻辑的方式。第二类结构型模式包含适配器、桥接、组合、装饰、外观、享元和代理七种模式。解决类和对象的组合,从而获得更大的结构。第三类行为型模式是包含解释器、模版方法、职责链、命令、迭代器、中介者、备忘录、观察者、状态、策略和访问者十一个模式,解决对象之间的通信职责分配。
在超级销售APP项目的开发过程中,我们综合使用了多种设计模式,本文着重对抽象工厂模式、外观模式、策略模式等三种设计模式在该项目中的具体应用进行介绍。
一、抽象工厂模式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定他们的类。每个生成的工厂都能按照工厂模式提供对象。在车险出单功能联合销售方案模块,通过车纬度信息、客户维度信息等标签信息测算推荐最佳组合销售方案,联合销售的非车方案相对固定,按照设计模式迪米特法则,实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。为了解决这个问题,我采用的方法是定义一个抽象的服务类,在其中声明了一个用来创建每一类组合销售方案的接口,而每一类的具体销售方案都继承了一个抽象的销售方案类,通过具体的子类来实现不同的销售方案具体定义,这就是一个典型的抽象工厂模式。
首先抽象工厂封装了创建销售方案行为和过程,具体不同的销售方案细节由不同的类实现,出单过程中通过调用工厂类操作实例,解决接口选择的问题。其次具体的工厂类只在初始化时出现一次,使得改变这个销售方案的具体工厂变得容易,把对象的实例化和初始化都封装起来,这样做其实保证了对象解耦。
二、外观模式
外观模式是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。对于出单后的保费支付根据各地监管要求不同,根据各地区政策实名验证要求提供如活体检测认证、手机验证码、公安联网身份认证等多种方式,为了解决访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口,提供相对一致的界面。综合业务场景分析采用外观模式解决。在系统中定义每个具体验证方法的实现类,通过facade对象,将这些具体的功能组件对象进行一次性封装,达到对用户进行了屏蔽。用户只需要访问Facade类,即可将请求发送给对应的子系统类,完成逻辑处理并把结果返回给用户,最终实现了子系统内部各个组件与用户之间的松耦合关系。用户无需关心组件内部具体的实现逻辑,在未来组件的功能发生变化时也不会对用户产生影响。通过外观模式有效解决了系统相互依赖、提高灵活性、安全性。
三、策略模式
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变。客户管理的增值服务,基于大数据的客户画像分析千人千面,针对不同的客户喜好送不同权益、或参与抽奖等。如果传统模式在有多种算法相似的情况下,使用IF…else实现将带来复杂和难以维护的代价,同时活动在越来越多情况下,开发人员对代码的掌握难度也会增大,可能欧冠其中一点会影响到其他的人活动正常使用。基于上述问题采用策略模式,创建服务接口类、权益及各种活动基于服务接口类进行具体实现细节,Context类构造函数初始化基于接口的对象类提供对外访问,客户的增值服务功能模块通过Context类达到服务的自有切换。如果业务的活动发生变化对于代码的调整不需要改变原有代码接口只需要实现服务类接口即可达到服务的新增。通过策略模式的活动方案可以自由切换,避免使用多重条件判断,极大的增加了系统的扩展性。
整个项目历时9个月的实施,于2020年7月完成验收并顺利上线,日均出单保费规模达到千万级别,赢得了良好的用户口碑也在业界内树立了标杆。
总结
在整个系统的分析设计过程中,我始终秉承面向对象的设计理念,对不同的用例进行全面的分析和考虑,结合自身的工作经验,采用了多种设计模式来支撑系统的实施工作。实践证明软件设计模式在面向对象的设计过程中发挥了不可或缺的作用,取得了满足业务要求的项目成功。同时我也积累了新的经验教训,例如在使用外观模式时,每个具体子类都对接口方法进行了重栽不符合开闭原则,如果要修改流程很麻烦,进而带来了维护的更多困难。为此解决问题和提高代码的质量是我们需要在设计模式和反设计模式之间找到平衡点,满足项目实际要求。谨以本文浅显地讨论了软件设计模式及在项目中的实际应用,希望能不断分析总结,提高面向对象软件设计水平和能力。
论文三
摘要
本人2022年有幸参加了中国石油集团的高性能数控测井系统项目的开发研制工作。该系统是在当前测井成套测井装备的基础上,为了满足高精度,高性能,高效率的要求开发的测井系统。该系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。本人在其中主要是负责测井软件系统的分析、设计以及部分开发任务。设计模式是前人设计面向对象软件的经验和总结,在软件设计中灵活的使用设计模式可以极大的提高系统的稳定性,可扩展性,以及良好的可维护性。本文描述了在测井软件系统开发过程中,如何分析和发现相关模式,以及如何选择和应用设计模式,特别是介绍了 MVC模式在软件框架和相关系统模块中的应用和使用效果。在文章的最后,讨论了在实际项目开发中,设计模式应用的有关想法和教训。
正文
随着当前石油测井技术的发展,为了能更快,更好的得到储层地层信息,解决目前国内测井系统不统一,测井精度不高,效率低下的缺点,2004年1月中国石油集团公司科技局成立了高性能数控测井系统项目,目的是为国内测井行业提供一个从井下到地面以及解释评价的整套测井系统。系统的设计目标是一次测井,取得所有合格资料,并且能保证60井次的免维修率。整个系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。我主要是负责测井软件系统的分析,设计和部分开发工作。整个测井软件系统完成三个主要任务:测井数据的采集、测井数据的工程值计算、测井过程的监控。测井数据采集主要是采集井下仪器通过测井遥测系统传输的测井数据,并保证数据的完整性,正确性。测井数据工程值计算主要是把采集的数据根据不同仪器刻度计算方法进行工程值的计算。测井过程监控主要是把计算的测井数据用曲线和图像的方式实时的显示在屏幕和打印成图,由测井操作员进行实时监控。
设计模式是前人设计面向对象软件的经验和总结,在软件设计中灵活的使用设计模式可以极大的提高系统的稳定性,可扩展性,以及良好的可维护性。
在测井软件系统框架进行分析和设计时,考虑如何提高系统的稳定性、可扩展性和可维护性时,我们采用了MVC设计模式。MVC模式构架包括三个部分:模型(Mode1)、视图(View)、控制(Control)。模型主要是对系统的数据和逻辑运算的封装。它独立与系统的界面和I/0。视图把表示模型的数据和逻辑关系用特定的形式展示给用户。控制处理用户和软件之间的交互操作,当模型的数据有所变化时,控制负责通知视图做出相应的更新。模型、视图、控制的相互分离有利于模块之间内聚性的提高,耦合更加松散。一个模型可以对应多个视图,由控制来传播模型的变化从而更新视图。MVC模式如何在测井软件系统实现,我们主要是从如下四个方面进行:
一、分析系统功能,分离功能模型
首先根据系统的主要任务进行系统的模块分解。根据测井软件系统数据采集、数据转换和测井监控三个主要任务,把系统分为三个模块对应于MvC模式的三个部分。其中模型(Mode1)对应于数据的采集和工程值的计算。测井视图(View)对应于测井监控功能。测井模型所要实现的功能包括:测井数据的采集、数据的刻度计算、数据的存储、数据的操作。测井数据的采集负责硬件平台的初始化,下井仪器的初始化,井下仪器数据的中断相应,数据帧的采集,数据帧的重组等。数据的刻度计算主要是根据不同的仪器实现数据的刻度计算,包括刻度系数表的获取、刻度计算、深度延迟计算等。数据存储主要是原始数据的存储和测井数据的存储。这里我们采用的是测井公用的XTF格式做为数据存储格式。数据的操作是视图和模型之间数据交互的接口。它主要是提供数据输入和输出功能。
二、视图的设计与实现
视图主要是提供测井数据的图形显示。通过调用模型中的数据操作方法,提取测井数据,根据不同的测井数据提供曲线、波列、图像等多种表现形式。在本系统的实现中,为了提高数据采集的稳定性和程序的健壮性,采用进程间通讯的方式。就是说视图的实现本身一个独立的程序。它与模型之间的通过TCP/IP网络进行通讯。视图主要包括数据源、数据表象对象、绘图打印模块等部分组成。数据源负责得到模型(Mode1)的数据,然后把数据分配给每个数据表象对象。数据表象对象是个有层次的类家族,其基类是绘图类(CDrawobj),所有的数据表象包括道(CDrawTrack)、曲线(CDrawCurve)、波列(CDrawWave)、图像(CDrawImage), 数值对象(CDrawData)等都是从其派生的。最后有绘图打印模块提供管理,负责视图的区域更新,数据表象的绘制和打印等功能。
三、控制的设计与实现
控制主要功能是提供用户的输入输出反馈,同时监控模型的数据变化,通知视图进行更新。由于控制和视图的耦合非常的紧密,在架构实现中,控制和视图是在一个应用程序中实现的。控制主要分为井下仪器控制和视图控制两个部分。其中井下仪器控制主要是由操作人员根据视图中的曲线和图像信息,对仪器发出的状态控制命令,以保证测井过程中数据和仪器的安全。视图控制则是操作人员对视图显示参数的调整,包括鼠标的响应和键盘的响应以及用户对测井原始图的特殊要求如道大小,曲线位置的摆放,颜色的调整等。
四、使用可动态添加算法模型
由于每次测井作业中下井仪器串的仪器种类和仪器的数量都是变化的,为了能更好的抽象出实际的测井模型,提高系统的灵活性,在模型中数据刻度计算部分,我们采用的动态添加的方式。我们把不同测井仪器的刻度算法封装到动态连接库,然后根据测井作业的不同,调用用不同的仪器动态库中的刻度算法。由于视图和控制与模型之间的松耦合,当用户添加算法模块,视图与控制基本不要修改。
在采用MVC模式的软件框架后,整个系统分为两个部分,数据采集管理器和数据实时浏览器。数据采集管理器对应于模型(Mode1)的实现,数据实时浏览器对应于视图(View)和控制(Control)的实现。我们采用的是VisualC++.net 基于Window2000平台来进行系统开发。采用MVC模式给我们带来了如下好处:
-
1、由于模型(Mode1)与视图(View)和控制(Control)之间的松耦合,使得我们非常容易就实现了一个模型运行同时建立多个视图。这在调试仪器时非常有用,当硬件人员调试仪器时直接连接网线就可以一边看仪器一边看数据。不再需要象以前必须到地面系统控制室查看数据了。
-
2、适合多硬件平台的跨接。由于不同的硬件平台上采集数据的方式都不同,有的系统采用的是PCI总线,有的是USB接入,有的是ISA卡接入。由于模型(Model)和视图(View)的松耦合,当要移植到不同的硬件平台上是我们只有修改相应的模型(Mode1),有可以实现对不同硬件平台的支持。
-
3、良好的可维护性和扩展性。由于采用MVC模式,系统模块功能划分明确,代码实现也相对容易。代码的错误不会在系统中扩散,同时由于可以动态添加仪器算法模块,当用户添加新仪器时,不需要更改系统程序,只有添加仪器动态库DLL就可以了。
总结
在整个系统的开发中,我们还应用了一些别的模式,有些模式是在进行系统设计时,就考虑到而特意实现的,有些模式是在采用别的方法实现后,效果不太理想,在代码重构时引进的。在应用设计模式进行系统设计和开发后,整个系统各个模块之间逻辑变的相对独立,耦合也很松散,结构的扩展性良好。而且使得代码的重用的程度变好,减少了错误的发生和错误在代码中的扩散。但是在实际应用模式的过程中,我还发现模式应用的经验越丰富,模式应用的就越好。有时在采用何种模式时,有几种模式方案可以采用,但是具体采用那个模式就需要不断的尝试,看看模式是否满足实际的需要。特别要注意的是不能为了设计模式进行设计,也就是过分设计的问题。这样会导致设计过于复杂,偏离程序设计简约够用的基本原则。
目前设计模式在软件开发中的应用正引起广大开发人员的注意,各大软件开发商也在软件开发工具中提供了有关设计模式的自动应用的工具,相信设计模式会越来越多应用于软件的设计和开发中。
更多内容请见: 备考系统架构设计师-核心总结索引
论文:论软件设计模式的应用
文章目录
- 论文一
- 摘要
- 正文
- 总结
- 论文二
- 摘要
- 正文
- 总结
- 论文三
- 摘要
- 正文
- 总结
论文一
摘要
2022年3月,本人所在公司承担了一项农业系统平台的开发项目,该项目主要是实现农业系统各项内部业务,以及各项农业项目的审批工作,并提供外部用户通过web服务进行信息访问。我在该项目中担任系统架构设计师一职,负责系统的架构设计和软件开发的部分设计工作。本文以该农业系统平台的开发项目为例,主要论述了软件设计模式在该系统开发中的具体应用。在农产品标准化模块中,针对不同的农产品质量指标我们采用了责任链模式;在数据访问中我们采用了工厂模式,以实现对不同数据格式的转换;在验证码生成中我们采用了策略模式,以实现算法的灵活替换。 通过使用这些设计模式,提高了软件的设计质量和开发效率,最终项目顺利上线,并获得用户一致好评。
正文
2022年3月,本人所在公司承担了某市农委系统的系统平台的开发项目,该项目是农业系统的工作平台。不仅承担着农委系统的内部业务工作,包括:生产处、环能处、经管处、农村处、生态处等多个处室。通过实施该系统,可以实现不同处室的业务信息的共享和交流,消除信息孤岛,提高办事效率和质量。另一方面,通过这个平台,可以为农产品加工企业、合作社农户等涉农群体,提供信息公开、在线审批、政策查询、留言信箱、技术推广等农业服务,实现与农产品加工企业、合作社农户等社会群体的网上在线交互,提高服务三农的质量和水平。在该项目中,本人担任系统架构设计师,负责项目的架构设计以及软件开发的部分工作。
由于传统的结构化的软件设计方法不符合面向对象的设计原则,无法很好的实现高内聚和低耦合的要求。模块之间过于紧密,给软件扩展和维护带来很多困难。在这种情况下,设计模式的出现和广泛应用给问题的解决提供了一种有效方法。通过利用设计模式,可以帮助开发者复用已有的设计方法,设计出结构合理、易于复用和可维护的软件,当用户需要发生改变时,可以通过修改少量代码或不修改原有代码即可满足新的需求,增强了系统的可修改性和稳定性,降低系统开发成本。
一般而言,一个设计模式具有模式名称、适应场景、解决方案和效果四个方面的基本要素。设计模式依据其目的可以分为创建型、结构型、行为型三种类型。创建型模式,主要负责对象的创建工作,程序在确定需要创建对象时,可以获得更大的灵活性。常用的创建型设计模式有:单例模式、工厂方法、原型、构造器、抽象工厂等5种模式。结构型模式,负责处理类或对象之间的关系,用于构件结构更加复杂庞大的系统。常用的结构型设计模式有适配器、桥接模式、享元模式、组合模式、外观模式、代理模式等7种模式。行为型模式,主要任务是对类或对象如何交互以及为类和对象分配具体职责进行描述。常用的行为型模式有观察者、状态、策略模式、备忘录、命令、责任链、中介者等11种模式。这些设计方法都是经过反复使用的成熟方法,对优化软件结构,提高软件质量具有重要的指导意义。
在农业信息平台的开发过程中,我们综合使用了多种设计模式,本文着重对责任链模式、工厂方法、策略模式等3种设计模式在该项目中的具体应用进行介绍。
一、责任链模式
我们在信息平台的开发过程中,需要完成对农产品质量进行标准化评选,从低到高评选无公害农产品、绿色产品、有机食品、地理标志认证4种认证,其中,无公害农产品的认定数量较多,标准较低,由农业生产处进行认定。在认定过程中,我们采用了责任链的设计模式。首先,定义了农产品对象fproducts,该对象中保存有农产质量的各项指标,包括水、空气、土壤等环境质量指标,及耕地净化、品种优质高抗、投入品无害化等生产技术。能够全面反映农产品质量水平。其次,我们定义了接口类deal,接口中持有一个农产品对象和自身的接口,以及处理函数processrequest。对外提供对农产品进行分类,并存入不同的信息数据库。随后,我们定义了无公害处理类、绿色食品、有机食品和地理标识4个实现类。对农产品对象fproducts的处理,按照由高到低的顺序,依次进行处理,直到符合某个标准为止,并完成信息处理,将对象信息按照审核的分档标准,存入信息库。通过这个方法,可以实现农产品对象,与处理方法的分离。
二、工厂方法
在农业产业化管理过程中,需要对各区市数据进行采集,由于不同类型的数据导入算法不同,在程序设计过程中,设计者需要定义若干类分别实现导入excel、xml、sqldata等类型的数据的算法,而且用户导入的数据类型存在不确定性,设计者无法确定应该实例化哪一个类。为解决这一问题,我们使用工厂方法模式。首先,定义一个数据访问接口类import。同时,针对不同的数据类型,还定义了ImportExcel、ImprotXML、ImportSQLDATA具体产品类,实现了import所声明的公共接口,其主要功能是封装了不同类型的数据导入到数据库的具体算法。Importcreator是抽象工厂类,持有一个接口产品类import的对象。Importexcelcreator、importXMLCreator、importSQLdata是具体工程类,主要功能是生产具体产品实体,直接在客户端的调用下创建产品实例。通过工厂方法模式的引入,可以有效解决客户需要变化对设计的影响,设计者无需知道那个子类被实例化,子类会根据具体情况自己决定实例化哪一个类,而且创建具体产品的细节也有着很好的封装,符合高内聚、低耦合的设计和原则。当需要在系统中添加新的产品时,也不需要修改抽象工厂和抽象产品的接口,以及其他具体工厂和具体产品,具有很好的的可扩展性。
三、策略模式
在系统的安全性方面,我们采用了用户名—密码—自动验证码相结合的办法,以保证系统访问安全性。根据验证码的使用环境,一般分为数字验证码、汉字验证码、英文验证码3种类型。而生成不同类型验证码的算法存在巨大差异,为此需要定义不同的生成验证码的算法。为解决此问题,可以利用策略模式将不同的算法封装起来,并使他们可以相互替换,使得算法独立于使用它的客户而变化。在设计策略模式中,我们定义了3个角色。环境角色:持有一个抽象策略角色
StrategyVerifyCode接口的引用,并通过StrategyVerifyCode接口,来实现一个具体的策略算法。抽象策略角色:定义所有的具体策略类所需的统一访问接口;具体策略角色:包装了相关的算法或行为;在该项目中,我们按照数字、文字、字符3种类型,分别定义了shuzi_verify、zifu_verify、wenzi_verify3个具体的策略类。通过使用策略算法,将生成验证码的算法封装在一个个独立的策略类中,用户可以根据自己的需求从不同策略中进行选择,有效的避免了使用条件转移语句不易维护的缺点。而且策略模式利用组合代替继承,将算法的实现与算法的选择分离开来,降低了程序之间的耦合度,增强了代码的可扩展性和可维护性。
总结
以上设计模式的选用基本达到了预期的效果。首先是,这些设计模式都是一些常用的设计方法,在架构设计师、系统分析师、开发人员之间,形成了良好的沟通桥梁,大家很容易进行交流和沟通。其次,在使用设计模式过程中,软件的开发效率较高,能够节省开发成本。最重要的是,这些模式都是一些经过反复使用的成熟设计方案,符合面向对象中设计规范,比如:面向接口编程、里氏替换原则、单一职责原则、依赖倒转等设计原则,最大限度的提高软件的标准化,为日后的系统维护打下了很好的基础。
当然,我们在设计过程中,也存在一些问题和不足,不少开发人员在设计过程中,有时还是习惯于原有的设计方法,对模式的使用有些抵触。而且,这些设计模式在应用过程中,往往不是单独使用,需要对多个模式进行综合运用。这方面,我们还缺少相关的经验。所以,在以后的项目设计中,我们将继续应用各种设计模式,做到融会贯通,不拘一格的目标,争取能设计出更多的高质量软件项目。
论文二
摘要
2019年10月,本人所在保险公司启动了超级销售APP项目,该项目通过运用先进的销售工具、客户管理、营销活动管理等功能以达到提升销售人员的效能,加大业务驱动的目标。在该项目中我担任系统架构师,负责系统的架构设计工作。本文以该项目为例,主要论述了软件设计模式在开发中的具体应用。
通过抽象工厂模式,实现出单流程车+人联合销售模块间的对象解耦,符合设计模式迪米特法则。通过外观模式,实现保费支付实名认证生物识别、手机号校验隐藏系统的复杂性,系统中的接口提供一致的界面。通过策略模式,实现客户营销基于大数据客户画像,达到不同活动方案可以自由切换。设计模式提高系统的可复用性、扩展性和开放性。基于以上技术应用,项目成功上线,获得用户一致好评。
正文
本人所在的保险公司分支机构遍布全国,已经设立分公司36家,机构总数超过2100家,营业机构覆盖全国各个省份,系统员工人数超6万人。因保险生态体系的变革,各保险公司都在积极科技转型,公司基于新业态发展通过"线上化、数字化、智能化"加速推进"三新三聚焦"的战略转型。故启动了超级销售APP项目建设,本项目旨在建设业界领先的面向销售的、具有前瞻性和可扩展性的,符合主流技术的保险销售一体化平台,聚集核心作业功能,体现支持、服务、提效和赋能。系统主要实现功能车险、非车险出单、业绩管理、客户管理、营销活动、商业计划书、续保管理等。通过两个视角挖掘,营销员视角,集获客、展业、服务、个人成长为一体,作业辅导始终伴随的创新工作模式、挖掘潜在销售机会,提高工作效率,促进职业能力发展。管理视角,综合管理招募、培训、业绩、活动、提供营销指导和线索及客户服务锦囊,降低消息传递成本、提升营销员团队整体产能和绩效。
该项目于2019年10月正式启动,我担任系统架构设计师角色,负责系统总体架构设计工作。在系统实现过程中,通过面向对象的分析和设计方案,达到了系统的可复用性和扩展性。设计模式代表了最佳的实践,是开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案经过相当长的一段时间的实验和错误总结出来的。在面向对象的软件设计过程中,为了使系统体系架构更加精巧灵活,针对特定问题采用的简洁而易于理解的解决方案。经典的软件设计模式按目的不同可以分为三大类:创建型模式、结构型模型和行为型模式。第一类创建型模式,包含工厂方法、抽象工厂、构建器、原型和单例五种模式,提供在创建对象的同时隐藏创建逻辑的方式。第二类结构型模式包含适配器、桥接、组合、装饰、外观、享元和代理七种模式。解决类和对象的组合,从而获得更大的结构。第三类行为型模式是包含解释器、模版方法、职责链、命令、迭代器、中介者、备忘录、观察者、状态、策略和访问者十一个模式,解决对象之间的通信职责分配。
在超级销售APP项目的开发过程中,我们综合使用了多种设计模式,本文着重对抽象工厂模式、外观模式、策略模式等三种设计模式在该项目中的具体应用进行介绍。
一、抽象工厂模式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定他们的类。每个生成的工厂都能按照工厂模式提供对象。在车险出单功能联合销售方案模块,通过车纬度信息、客户维度信息等标签信息测算推荐最佳组合销售方案,联合销售的非车方案相对固定,按照设计模式迪米特法则,实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。为了解决这个问题,我采用的方法是定义一个抽象的服务类,在其中声明了一个用来创建每一类组合销售方案的接口,而每一类的具体销售方案都继承了一个抽象的销售方案类,通过具体的子类来实现不同的销售方案具体定义,这就是一个典型的抽象工厂模式。
首先抽象工厂封装了创建销售方案行为和过程,具体不同的销售方案细节由不同的类实现,出单过程中通过调用工厂类操作实例,解决接口选择的问题。其次具体的工厂类只在初始化时出现一次,使得改变这个销售方案的具体工厂变得容易,把对象的实例化和初始化都封装起来,这样做其实保证了对象解耦。
二、外观模式
外观模式是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。对于出单后的保费支付根据各地监管要求不同,根据各地区政策实名验证要求提供如活体检测认证、手机验证码、公安联网身份认证等多种方式,为了解决访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口,提供相对一致的界面。综合业务场景分析采用外观模式解决。在系统中定义每个具体验证方法的实现类,通过facade对象,将这些具体的功能组件对象进行一次性封装,达到对用户进行了屏蔽。用户只需要访问Facade类,即可将请求发送给对应的子系统类,完成逻辑处理并把结果返回给用户,最终实现了子系统内部各个组件与用户之间的松耦合关系。用户无需关心组件内部具体的实现逻辑,在未来组件的功能发生变化时也不会对用户产生影响。通过外观模式有效解决了系统相互依赖、提高灵活性、安全性。
三、策略模式
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变。客户管理的增值服务,基于大数据的客户画像分析千人千面,针对不同的客户喜好送不同权益、或参与抽奖等。如果传统模式在有多种算法相似的情况下,使用IF…else实现将带来复杂和难以维护的代价,同时活动在越来越多情况下,开发人员对代码的掌握难度也会增大,可能欧冠其中一点会影响到其他的人活动正常使用。基于上述问题采用策略模式,创建服务接口类、权益及各种活动基于服务接口类进行具体实现细节,Context类构造函数初始化基于接口的对象类提供对外访问,客户的增值服务功能模块通过Context类达到服务的自有切换。如果业务的活动发生变化对于代码的调整不需要改变原有代码接口只需要实现服务类接口即可达到服务的新增。通过策略模式的活动方案可以自由切换,避免使用多重条件判断,极大的增加了系统的扩展性。
整个项目历时9个月的实施,于2020年7月完成验收并顺利上线,日均出单保费规模达到千万级别,赢得了良好的用户口碑也在业界内树立了标杆。
总结
在整个系统的分析设计过程中,我始终秉承面向对象的设计理念,对不同的用例进行全面的分析和考虑,结合自身的工作经验,采用了多种设计模式来支撑系统的实施工作。实践证明软件设计模式在面向对象的设计过程中发挥了不可或缺的作用,取得了满足业务要求的项目成功。同时我也积累了新的经验教训,例如在使用外观模式时,每个具体子类都对接口方法进行了重栽不符合开闭原则,如果要修改流程很麻烦,进而带来了维护的更多困难。为此解决问题和提高代码的质量是我们需要在设计模式和反设计模式之间找到平衡点,满足项目实际要求。谨以本文浅显地讨论了软件设计模式及在项目中的实际应用,希望能不断分析总结,提高面向对象软件设计水平和能力。
论文三
摘要
本人2022年有幸参加了中国石油集团的高性能数控测井系统项目的开发研制工作。该系统是在当前测井成套测井装备的基础上,为了满足高精度,高性能,高效率的要求开发的测井系统。该系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。本人在其中主要是负责测井软件系统的分析、设计以及部分开发任务。设计模式是前人设计面向对象软件的经验和总结,在软件设计中灵活的使用设计模式可以极大的提高系统的稳定性,可扩展性,以及良好的可维护性。本文描述了在测井软件系统开发过程中,如何分析和发现相关模式,以及如何选择和应用设计模式,特别是介绍了 MVC模式在软件框架和相关系统模块中的应用和使用效果。在文章的最后,讨论了在实际项目开发中,设计模式应用的有关想法和教训。
正文
随着当前石油测井技术的发展,为了能更快,更好的得到储层地层信息,解决目前国内测井系统不统一,测井精度不高,效率低下的缺点,2004年1月中国石油集团公司科技局成立了高性能数控测井系统项目,目的是为国内测井行业提供一个从井下到地面以及解释评价的整套测井系统。系统的设计目标是一次测井,取得所有合格资料,并且能保证60井次的免维修率。整个系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。我主要是负责测井软件系统的分析,设计和部分开发工作。整个测井软件系统完成三个主要任务:测井数据的采集、测井数据的工程值计算、测井过程的监控。测井数据采集主要是采集井下仪器通过测井遥测系统传输的测井数据,并保证数据的完整性,正确性。测井数据工程值计算主要是把采集的数据根据不同仪器刻度计算方法进行工程值的计算。测井过程监控主要是把计算的测井数据用曲线和图像的方式实时的显示在屏幕和打印成图,由测井操作员进行实时监控。
设计模式是前人设计面向对象软件的经验和总结,在软件设计中灵活的使用设计模式可以极大的提高系统的稳定性,可扩展性,以及良好的可维护性。
在测井软件系统框架进行分析和设计时,考虑如何提高系统的稳定性、可扩展性和可维护性时,我们采用了MVC设计模式。MVC模式构架包括三个部分:模型(Mode1)、视图(View)、控制(Control)。模型主要是对系统的数据和逻辑运算的封装。它独立与系统的界面和I/0。视图把表示模型的数据和逻辑关系用特定的形式展示给用户。控制处理用户和软件之间的交互操作,当模型的数据有所变化时,控制负责通知视图做出相应的更新。模型、视图、控制的相互分离有利于模块之间内聚性的提高,耦合更加松散。一个模型可以对应多个视图,由控制来传播模型的变化从而更新视图。MVC模式如何在测井软件系统实现,我们主要是从如下四个方面进行:
一、分析系统功能,分离功能模型
首先根据系统的主要任务进行系统的模块分解。根据测井软件系统数据采集、数据转换和测井监控三个主要任务,把系统分为三个模块对应于MvC模式的三个部分。其中模型(Mode1)对应于数据的采集和工程值的计算。测井视图(View)对应于测井监控功能。测井模型所要实现的功能包括:测井数据的采集、数据的刻度计算、数据的存储、数据的操作。测井数据的采集负责硬件平台的初始化,下井仪器的初始化,井下仪器数据的中断相应,数据帧的采集,数据帧的重组等。数据的刻度计算主要是根据不同的仪器实现数据的刻度计算,包括刻度系数表的获取、刻度计算、深度延迟计算等。数据存储主要是原始数据的存储和测井数据的存储。这里我们采用的是测井公用的XTF格式做为数据存储格式。数据的操作是视图和模型之间数据交互的接口。它主要是提供数据输入和输出功能。
二、视图的设计与实现
视图主要是提供测井数据的图形显示。通过调用模型中的数据操作方法,提取测井数据,根据不同的测井数据提供曲线、波列、图像等多种表现形式。在本系统的实现中,为了提高数据采集的稳定性和程序的健壮性,采用进程间通讯的方式。就是说视图的实现本身一个独立的程序。它与模型之间的通过TCP/IP网络进行通讯。视图主要包括数据源、数据表象对象、绘图打印模块等部分组成。数据源负责得到模型(Mode1)的数据,然后把数据分配给每个数据表象对象。数据表象对象是个有层次的类家族,其基类是绘图类(CDrawobj),所有的数据表象包括道(CDrawTrack)、曲线(CDrawCurve)、波列(CDrawWave)、图像(CDrawImage), 数值对象(CDrawData)等都是从其派生的。最后有绘图打印模块提供管理,负责视图的区域更新,数据表象的绘制和打印等功能。
三、控制的设计与实现
控制主要功能是提供用户的输入输出反馈,同时监控模型的数据变化,通知视图进行更新。由于控制和视图的耦合非常的紧密,在架构实现中,控制和视图是在一个应用程序中实现的。控制主要分为井下仪器控制和视图控制两个部分。其中井下仪器控制主要是由操作人员根据视图中的曲线和图像信息,对仪器发出的状态控制命令,以保证测井过程中数据和仪器的安全。视图控制则是操作人员对视图显示参数的调整,包括鼠标的响应和键盘的响应以及用户对测井原始图的特殊要求如道大小,曲线位置的摆放,颜色的调整等。
四、使用可动态添加算法模型
由于每次测井作业中下井仪器串的仪器种类和仪器的数量都是变化的,为了能更好的抽象出实际的测井模型,提高系统的灵活性,在模型中数据刻度计算部分,我们采用的动态添加的方式。我们把不同测井仪器的刻度算法封装到动态连接库,然后根据测井作业的不同,调用用不同的仪器动态库中的刻度算法。由于视图和控制与模型之间的松耦合,当用户添加算法模块,视图与控制基本不要修改。
在采用MVC模式的软件框架后,整个系统分为两个部分,数据采集管理器和数据实时浏览器。数据采集管理器对应于模型(Mode1)的实现,数据实时浏览器对应于视图(View)和控制(Control)的实现。我们采用的是VisualC++.net 基于Window2000平台来进行系统开发。采用MVC模式给我们带来了如下好处:
-
1、由于模型(Mode1)与视图(View)和控制(Control)之间的松耦合,使得我们非常容易就实现了一个模型运行同时建立多个视图。这在调试仪器时非常有用,当硬件人员调试仪器时直接连接网线就可以一边看仪器一边看数据。不再需要象以前必须到地面系统控制室查看数据了。
-
2、适合多硬件平台的跨接。由于不同的硬件平台上采集数据的方式都不同,有的系统采用的是PCI总线,有的是USB接入,有的是ISA卡接入。由于模型(Model)和视图(View)的松耦合,当要移植到不同的硬件平台上是我们只有修改相应的模型(Mode1),有可以实现对不同硬件平台的支持。
-
3、良好的可维护性和扩展性。由于采用MVC模式,系统模块功能划分明确,代码实现也相对容易。代码的错误不会在系统中扩散,同时由于可以动态添加仪器算法模块,当用户添加新仪器时,不需要更改系统程序,只有添加仪器动态库DLL就可以了。
总结
在整个系统的开发中,我们还应用了一些别的模式,有些模式是在进行系统设计时,就考虑到而特意实现的,有些模式是在采用别的方法实现后,效果不太理想,在代码重构时引进的。在应用设计模式进行系统设计和开发后,整个系统各个模块之间逻辑变的相对独立,耦合也很松散,结构的扩展性良好。而且使得代码的重用的程度变好,减少了错误的发生和错误在代码中的扩散。但是在实际应用模式的过程中,我还发现模式应用的经验越丰富,模式应用的就越好。有时在采用何种模式时,有几种模式方案可以采用,但是具体采用那个模式就需要不断的尝试,看看模式是否满足实际的需要。特别要注意的是不能为了设计模式进行设计,也就是过分设计的问题。这样会导致设计过于复杂,偏离程序设计简约够用的基本原则。
目前设计模式在软件开发中的应用正引起广大开发人员的注意,各大软件开发商也在软件开发工具中提供了有关设计模式的自动应用的工具,相信设计模式会越来越多应用于软件的设计和开发中。
更多内容请见: 备考系统架构设计师-核心总结索引