摘要
2020年5月,我所在的公司承接了某影音产品销售公司开发一套在线销售系统以及对应的后台管理平台,该项目主要是实现对客户营销,提升服务的质量和提高办公效率,支持用户通过web服务进行信息访问,支持公司内部员工通过登录后台管理平台对产品进行管理和维护。我在该项目中担任系统架构师一职,负责系统的架构设计和软件开发的部分设计工作。
本文以该项目为例,主要论述了软件设计模式在该系统开发中的具体应用。在数据访问层,我们采用了工厂设计模式,定义统一的操作数据库的接口,以实现根据具体的类来访问不同的数据库;在验证码生成中,我们采用了策略模式,以实现算法的灵活替换;在订单模块中,我们采用了适配器模式,以实现根据不同会员等级来计算折扣税率。该项目历时1年,最终于2021年5月成功上线,获得了客户的一致好评。

正文
2020年5月,本人所在的公司承担了某影音产品销售公司开发一套在线销售系统以及后台管理系统的项目开发。在对客销售系统中,不仅支持用户通过PC端访问,还支持用户通过微信小程序,app等终端进行访问。在后台销售系统管理平台,支持后台对各个产品的管理和维护,而且需要接入各个不同的供应商,需要根据不同的供应商计算不同的折扣税率。由于各个供应商的的数据来源不统一,有的供应商使用的数据源是mysql,有的供应商又是oracle,还有的是使用的hbase等数据库。数据来源格式不统一,数据如何接入,成为项目当中的一个难点,加上供应商更换的频率较高,每次更换都会给公司带来较高的开发成本和维护成本。所以,在项目的初期,需要有一个良好的架构设计,提高系统的可修改性和可维护性。2020年6月,在我司总工程师的建议下,我有幸被公司命名为该项目的系统架构师,主要负责前期的架构设计以及部分的软件开发工作。
由于传统的结构化的软件设计方法不符合面向对象的设计原则,无法很好的实现高内聚和低耦合的要求。模块之间过于紧密,给软件扩展和维护带来很多困难。在这种情况下,设计模式的出现和广泛应用给问题的解决提供了一种有效方法。通过利用设计模式,可以帮助开发者复用已有的设计方法,设计出结构合理、易于复用和可维护的软件,当用户需要发生改变时,可以通过修改少量代码或不修改原有代码即可满足新的要求,增强了系统的可修改性和稳定性,降低系统的开发成本。
一般而言,一个设计模式具有模式名称、问题、解决方案和效果四个方面的基本要素。设计模式依据其目的可以分为创建型、结构型、行为型三种类型。创建型模式主要用于创建对象,为设计类实例化新对象提供指南。常用的创建型模式有工厂模式、抽象工厂模式、单例模式、原型模式、构造器模式等5种模式。结构型模式主要用于处理类或对象的组合,对类如何设计以形成更大的结构提供指南。常用的结构型模式有适配器模式、桥接模式、代理模式、装饰器模式、享元模式、组合模式、外观模式等7种模式。行为型模式主要用于处理类或对象的交互以及职责的分配,为类之间的交互或职责的分配提供指南。常用的行为型模式主要有责任链模式、迭代器模式、中介者模式、观察者模式、备忘录模式、模板方法模式、访问者模式、解释器模式、命令模式、策略模式、状态模式等11种模式。这些设计方法都是经过反复使用的成熟方法,对优化软件结构,提高软件质量具有重要的指导意义。
在该项目中,我们综合使用了多种设计模式,本文着重对工厂设计模式、策略模式、适配器模式等3种模式在该项目中的具体应用进行介绍。
一、工厂设计模式
在该后台管理平台中,需要接入不同的供应商,有些供应商的数据来源不统一,为了兼容不同的数据来源,我们定义了一个统一的操作数据库的接口,然后根据数据库的不同,由类工厂来决定实例化哪个类。在具体类中实现特定的数据库访问类。这样,就可以实现由客户端指定或根据配置文件来选择访问不同的数据库,从而实现应用程序与数据库无关。通过工厂设计模式的引入,可以有效解决客户需要变化对设计的影响,设计者无需知道哪个子类会被实例化,子类会根据具体情况自己决定实例化哪一个类,符合高内聚、低耦合的设计原则。当有新的供应商加入时,只要知道他的数据来源,调用一下相应的子类即可获取到他相应的数据。
二、策略模式
在系统的安全性方面,我们采用了用户名-密码-自动验证码相结合的办法,以保证系统访问安全性。根据验证码的使用环境,一般分为数字验证码、汉字验证码、英文验证码3种类型。而生成不同类型验证码的算法存在巨大差异,为此需要定义不同的生成验证码的算法。为解决此问题,可以利用策略模式将不同的算法封装起来,并使他们可以相互替换,使得算法独立于使用它的客户而变化。在设计策略模式中,我们定义了3个角色。环境角色:持有一个抽象策略角色StrategyVerfyCode接口的引用,并通过StrategyVerfyCode接口,来实现一个具体的策略算法。抽象策略角色:定义所有具体策略类所需的统一访问接口;具体抽象角色:包装了相关的算法或行为。在该项目中,我们按照数字、文字、字符3种类型,分别定义了ShuziVerfy、ZifuVerfy、WenziVerfy 3个具体的策略类。通过使用策略算法,将生成验证码的算法封装在一个个独立的策略类中,用户可以根据自己的需求从不同策略中进行选择,有效的避免了使用条件转移语句不易维护的缺点。而且策略模式利用组合代替继承,将算法的实现与算法的选择分离开来,降低了程序之间的耦合度,增强了代码的可扩展性和可维护性。
三、适配器模式
在后台管理平台中,考虑到该公司需要频繁的变更供应商,且每个供应商根据合同的谈判结果会得到不同的税率计算,为了尽可能少地在系统中修改或创建新类,我们使用了适配器模式。具体的实现方式是,增加一个类作为适配器,转换类的接口到客户端类期望的另一个接口。实现一个适配器类,这个类为系统的其他部分提供了一个不变的方法供调用,为了集成不同商品供应商提供的税率计算类,编写一个适配器类的子类,包含调用购买类所需的代码。该子类将系统的调用映射到某个供应商的税率计算类。如果要更换供应商,那么只需要写一个新的适配器子类,其他保持不变。
以上设计模式的选用基本达到了预期的效果。首先是,这些设计模式都是一些常用的设计方法,在架构设计师、开发人员之间,形成了良好的沟通桥梁,大家很容易进行交流和沟通。其次,在使用设计模式过程中,软件的开发效率较高,能够节省开发成本。最重要的是,这些设计模式都是一些经过反复使用的成熟的设计方案,符合面向对象中的设计规范,比如面向接口编程、里氏替换原则、单一职责原则、依赖倒转等设计原则,最大限度地提高软件地标准化,为日后的系统维护打下了良好地基础。
当然,我们在设计过程中,也存在一些问题和不足,不少开发人员在设计过程中,有时还是习惯于原有的设计方法,多模式的使用有些抵触。而且,这些设计模式在应用过程中,往往不是单独使用,需要对多个模式进行综合运用。这方面,我们还缺少相关的经验。所以,在以后的项目设计中,我们将继续应用各种设计模式,做到融汇贯通,不拘一格的目标,争取能设计出更多的高质量软件项目。

Logo

开源、云原生的融合云平台

更多推荐