图形图像算法中必须要了解的设计模式(2)
AI越来越火热,人工智能已然成风!而人工智能最重要是各种算法,因此机器学习越来越受到追捧,算法越来越被重视。
作为一个算法的研究者,写出一手高级算法当然是令人兴奋的一件事!但你是否有时会有这种感觉:
写的算法很难通用于所有的数据类型!每来一个新类型的数据,又得改一下算法,或新加一个方法来支持这种类型。
有时候多个算法需要灵活组合,甚至每个算法的顺序不一样都会产生不一样的效果;每一种组合都要为其构建一个新算法,即累又麻烦。
算法越来越多,自建的算法库也越来越庞大而难于管理;
这个时候,让你的算法具有更好通用性、拓展性就显得极为重要!因此,你必须要掌握几个重要的设计模式来解决这些问题。今天介绍一种在算法领域中应用最广泛的设计模式——策略模式。
策略模式
定义一系列算法,将每个算法都封装起来,并且使他们之间可以相互替换。策略模式使算法可以独立于使用它的用户而变化。
策略模式是对算法、规则的一种封装。它具有以下的优点:
算法(规则)可自由地切换。
避免使用多重条件判断。
方便拓展和增加新的算法(规则)。
应用案例
假设有这样一个应用场景:
有一Person类,有年龄(age),体重(weight),身高(height)三个属性。现要对Person的一组对象进行排序,但并没有确定根据什么规则来排序,有时需要根据年龄进行排序,有时需要根据身高进行排序,有时可能是根据身高和体重的综合情况来排序,还有可能……
通过对这个应用场景进行分析,我们会发现,这里需要有多种排序算法,而且需要动态地在这几种算法中进行选择,在未来可能还会添加一新的排序规则……
怎样让我们的排序算法更加的灵活,以适应各种各样的排序规则呢?这里我们就要用到策略模式。来,我们一起看一下具体的代码实现吧。
源码示例:
测试代码:
输出结果:
看到这,一些熟悉Python的同学肯定要吐槽了!Python是一个简洁明了的语言,使用十几行代码就能解决的问题(如下面的实现代码),为什么要写上面这一大堆的东西。
输出的结果和上面是一模一样的,这里不再赘述。
能提出这个问题,说明你一定是带着思考在阅读!之所以还要这么写,出于以下几个原因:
设计模式是一种编译思想,他和语言没有强关联,应当适用于所有面向对象的语言。Python因为语言本身的灵活性和良好的封装性,使得其自带了很多的功能,而其他语言并没有这样的功能。也许你的算法就是用C++或者Java来写的呢!为了让熟悉其他语言的人也能看懂,这里使用了最接近面向对象思维的方式进行实现(即使你熟悉Python也可通过他来学习一种新的思维方式)。
使用Python语言本身的特性,还是难以实现一些特殊的需求,如要根据身高和体重的综合情况来排序(身高和体重的权重分别是0.6和0.4)。用策略模式就可以很方便地实现,只需要增加一个CompareByHeightAndWeight的策略类就可以,如下面代码:
使用策略模式能让我们写的算法适用于各种规则和各种对象类型,极大地提高了算法的灵活性和拓展性。
Get到技能点了吗?
想了解更多更详细的信息,或想学习更多其他设计模式,请扫描下放二维码!下一篇将继续讲解《图形图像算法中必须要了解的设计模式(3)》。
《从生活中领悟设计模式(Python)》适合具有一定编程基础又渴望提升自己编程技能的人,此课程如果武功秘籍一般力求用最通俗的语言阐述最难懂的概念;用最简单的语法实现最复杂的逻辑;用最短小的代码写出最强悍的程序!
此课程分三卷内容:
第一卷:基础篇(第01~21课),19 种常用设计模式单独章节讲解 + 剩余 4 种模式合集(会有1~2篇的篇幅);
第二卷:进阶篇(第22~24课),是基础设计模式的衍生,也是各大编程语言中非常重要而常见的种编程机制;
第三卷:经验篇(第25~27课),将会分享我对设计原则、设计模式、项目重构的经验和看法。
领取专属 10元无门槛券
私享最新 技术干货