我选择的软件设计模式为策略模式(strategy pattern)
一、策略模式
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
二、引用关键代码解释该设计模式在该应用场景中的适用性
我设计的应用场景为学习算法的学生对各种不同的排序算法进行时间上的测量和比较。
因为在此场景下,用户需要频繁地对算法策略(采用何种排序算法)进行选择和更替。所以采用此模式可以简洁灵活地完成算法的切换,极大地简化这一过程。
也使得用户只需要关注输入的形式即可。
关键代码如下:
抽象基类sortStrategy
三个子类继承sortStrategy,并重定义纯虚函数。
context类,负责切换策略
主函数(部分)
三、引入该设计模式后对系统架构和代码结构带来了哪些好处
系统各模块间耦合度降低,扩展性极佳,添加新的算法策略只需要设计新的类去继承sortStrategy类并实现相关接口即可。代码变得简洁易读。
四、解释其中用到的多态机制
selectSorter,shellSorter,bubbleSorter三个类继承了sortStrategy类并重定义了纯虚函数sortOperation,三个类都有这一函数但实现各不相同。
context类具有私有成员:sortStrategy类的指针。在进行算法策略的使用时,只需要新建三个子类的指针,将其传入context的私有sortStrategy指针中,便可以使用特定实现的排序函数。
这一过程可以通过构造函数完成,也可以通过接口setContext完成。之后统一通过doSort执行排序。
五、说明模块抽象封装的方法
将排序策略抽象为sortStrategy类并定义纯虚函数,再设计具体的不同算法排序的类继承之。
调用排序算法的过程中全部使用sortStrategy类的指针和接口,实现多态。
六、分析各个模块的内聚度和模块之间的耦合度
算法策略模块(sortStrategy,selectSorter,shellSorter,bubbleSorter)通过环境模块(context)与主函数模块(main)耦合。
算法策略模块与环境模块直接耦合,环境模块与主函数模块直接耦合,算法策略模块与主函数模块不耦合。
算法策略模块的内聚主要是通过继承关系来体现的。
七、提供该应用范例完整的源代码包括构建部署的操作过程,建议以github版本库URL的方式提供源代码,其中README.md中说明构建部署的操作过程
https://github.com/TravisBacon/softwarePatternDesign.git
直接在VS上运行即可