设计模式最佳实践探索—策略模式

2个月前 (11-17 23:51)阅读2回复0
小小的人啊
小小的人啊
  • 管理员
  • 注册排名4
  • 经验值100485
  • 级别管理员
  • 主题20097
  • 回复0
楼主

根据差别的应用场景与企图,设想形式次要分为创建型形式、构造型形式和行为型形式三类。本文次要摸索行为型形式中的战略形式若何更好地应用于理论中。

媒介

在软件开发的过程中,需求的多变性几乎是不成制止的,而做为一名办事端开发人员,我们所设想的法式应尽可能撑持从手艺侧可以快速、稳健且低成当地响应纷繁多变的营业需求,从而推进营业小步快跑、快速迭代。设想形式恰是前辈们针对差别场景下差别类型的问题,所沉淀下来的一套法式设想思惟与处理计划,用来进步代码可复用性、心爱惜性、可读性、稳健性以及平安性等。下面是设想形式的祖师爷GoF(Gang of Four,四人帮)的合影,感触感染一下大佬的气量~

灵敏应用设想形式不只能够使法式自己具有更好的强健性、易修改性和可扩展性,同时它使得编程变得工程化,关于多人协做的大型项目,可以降低敬服成本、提拔多人协做效率。根据差别的应用场景与企图,设想形式次要分为三类,别离为创建型形式、构造型形式和行为型形式。本文次要摸索行为型形式中的战略形式若何更好地应用于理论中。

利用场景

战略形式属于对象的行为形式,其意图是针对一组可替代的算法,将每一个算法封拆到具有配合接口的独立的类中,使得算法能够在不影响到客户端(算法的挪用方)的情状下发作改变,利用战略形式能够将算法的定义与利用隔分开来,包管类的单一职责原则,使得法式整体契合开闭原则。

以手淘中商详页的店铺卡片为例,店铺卡片次要包罗店铺名称、店铺logo、店铺类型以及店铺品级等信息,此中差别店铺类型的店铺品级计算逻辑是差别的,为了获取店铺品级,能够接纳如下所示代码:

那种写法固然实现简单,但使得各类店铺品级计算逻辑与法式其他逻辑相耦合,将来若是要对此中一种计算逻辑停止更改或者新增加一种计算逻辑,将不能不对原有代码停止更改,违犯了OOP的单一职责原则与开闭原则,让代码的敬服变得困难。若项目自己比力复杂,去改动项目原有的逻辑是一件十分耗时又风险庞大的工作。此时我们能够采纳战略形式来处置,将差别类型的店铺品级计算逻辑封拆到具有配合接口又互相独立的类中,其核心类图如下所示:

展开全文

如许一来,法式便具有了优良的可扩展性与易修改性,若想增加一种新的店铺品级计算逻辑,则可将其对应的品级计算逻辑零丁封拆成ShopRankHandler接口的实现类即可,同样的,若想对此中一种战略的实现停止更改,在响应的实现类中停止更改即可,而不消侵入原有代码中去开发。

更佳理论摸索

本节仍以店铺品级的处置逻辑为例,摸索战略形式的更佳理论。当利用战略形式的时候,会将一系列算法用具有不异接口的战略类封拆起来,客户端想挪用某一详细算法,则可分为两个步调:1、某一详细战略类对象的获取;2、挪用战略类中封拆的算法。好比客户端承受到的店铺类型为“天猫”,则起首需要获取TmShopRankHandleImpl类对象,然后挪用此中的算法停止天猫店铺品级的计算。在上述两个步调中,步调2是依赖于步调1的,当步调1完成之后,步调2也随之完成,因而上述步调1成为整个战略形式中的关键。

下面列举几种战略形式的实现体例,其区别次要在于详细战略类对象获取的体例差别,对其优缺点停止阐发,并摸索其更佳理论。

▐暴力法

客户端挪用

效果

至此,当我们需要新增战略类时,需要做的改动如下:

长处

缺点

客户端与战略类仍存在耦合,当需要增加一种新类型店铺时,除了需要增加新的店铺品级计算战略类,客户端需要改动if else分收,不契合开闭原则。

▐第一次迭代(列举+简单工场)

有没有什么办法能使客户端与详细的战略实现类彻底停止解耦,使得客户端对战略类的扩展实现“零”感知?在互联网范畴,没有什么问题是加一层处理不了的,我们能够在客户端与浩瀚的战略类之间参加工场来停止隔离,使得客户端只依赖工场,而详细的战略类由工场负责产生,使得客户端与战略类解耦,详细实现如下所示:

效果

至此,当我们需要新增战略类时,需要做的改动如下:

比拟上一种体例,战略类与客户端停止解耦,无需更改客户端的代码。

长处

将客户端与战略类停止解耦,客户端只面向战略接口停止编程,对详细战略类的改变(更改、增删)完全无感知,契合开闭原则。

缺点

需要引入额外的工场类,使系统构造变得复杂。

当新参加战略类时,工场类中初始化战略的部门仍然需要改动。

▐第二次迭代(操纵Spring框架初始化战略beans)

在列举+简单工场实现的体例中,操纵简单工场将客户端与详细的战略类实现停止领会耦,但工场类中初始化战略beans的部门仍然与详细战略类存在耦合,为了进一步解耦,我们能够操纵Spring框架中的InitializingBean接口与ApplicationContextAware接口来实现战略beans的主动拆配。InitializingBean接口中的afterPropertiesSet办法在类的实例化过程傍边施行,也就是说,当客户端完成注入ShopRankHandlerFactory工场类实例的时候,afterPropertiesSet也已经施行完成。因而我们能够通过重写afterPropertiesSet办法,在此中操纵getBeansOfType办法来获取到战略接口的所有实现类,并存于Map容器之中,到达工场类与详细的战略类解耦的目标。比拟于上一种实现体例,需要改动的代码如下:

效果

至此,当我们需要新增战略类时,需要做的改动如下:

比拟于上一种体例,能够省略工场类在初始化战略beans时要增加新的战略类那一步调。

长处

借助Spring框架完成战略beans的主动拆配,使得战略工场类与详细的战略类进一步解耦。

缺点

需要借助Spring框架来完成,不外在Spring框架应用如斯普遍的今天,那个缺点能够忽略不计。

▐最末迭代(操纵泛型进一步进步战略工场复用性)

颠末上面两次迭代以后,战略形式的实现已经变得十分便利,当需求发作改动的时候,我们再也不消手忙脚乱了,只需要存眷新增或者改变的战略类就好,而不消侵入原有逻辑去开发。但是还有没有改良的空间呢?

想象一下有一个新营业同样需要战略形式来实现,若是为其从头写一个战略工场类,整个战略工场类中除了新的战略接口外,其他代码均与之前的战略工场不异,呈现了大量反复代码,那是我们所不克不及忍耐的。为了更大程度制止反复代码的呈现,我们能够利用泛型将战略工场类中的战略接口参数化,使其变得更灵敏,从而进步其的复用性。

理论存在,理论起头!代码示意如下:

效果

此时,若想新建一个战略工场,则只需将战略接口做为参数传入泛型战略工场即可,无需再写反复的样板代码,战略工场的复用性大大进步,也大大进步了我们的开发效率。

长处

将战略接口类型参数化,战略工场不受接口类型限造,成为肆意接口的战略工场。

缺点

系统的笼统水平、复杂度变高,倒霉于曲不雅理解。

完毕语

进修设想形式,关键是进修设想思惟,不克不及简单地生搬硬套,灵敏准确地应用设想形式能够让我们在开发中获得事半功倍的效果,但也不克不及为了利用设想形式而过度设想,要合理平衡设想的复杂度和灵敏性。

本文是对战略形式更佳理论的一次摸索,纷歧定是事实上的更佳理论,欢送各人斧正与讨论。

END

开源最末的价值不只是获客

那里有最新开源资讯、软件更新、手艺干货等内容

点那里 ↓↓↓ 记得 存眷✔ 标星⭐ 哦~

0
回帖

设计模式最佳实践探索—策略模式 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息