策略模式是指有一个策略类,不同的策略类实现不同的算法。
策略模式封装了变化,把具体算法用策略类包装起来。
封装变化面向对象的重要的思维方式。
目录
策略模式,运用不同的策略类。用“算法”这个概念来抽象不同的策略类中的具体策略。
那么我具体要用到哪种算法呢,我先配置为不同的策略类。只改变配置不同的策略类这一个改变,就能调用的到不同的算法了。
背后具体的设计就是如下:
定义:
策略模式中定义一系列算法的方法,这些算法都是完成相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了具体实现算法类与使用算法类之间的耦合。策略模式在具体算法实现 和 使用者增加了策略类——把不同的算法放入到不同的策略类中,切换不同的算法,只需要切换不同的策略即可。(具体源码中的例子就是切换不同的tool就行了)
源码实例:
通过分析源码,对应上图中的元素,画出类图。
类图
Context以及Strategy对象
客户Context : sample 以及 sample派生类(Sample_SoloMesh,Sample_TileMesh,Sample_TempObstacles),包含一个指向【策略对象】的指针 m_tool
策略对象Strategy : sampleTool 以及 sampleTool派生类 (NavMeshTesterTool,OffMeshConnectionTool,ConvexVolumeTool,CrowdTool)
ContextInterface :sample 的 handleUpdate
AlgorithmInterface :sampleTool 的 handleUpdate
Context设置原始Strategy
具体客户(Sample_SoloMesh, Sample_TileMesh, Sample_TempObstacles) 创建的时候设定其对应的【策略对象】
比如 Sample_SoloMesh 的构造函数默认设置m_tool为NavMeshTesterTool。
Context主动切换Strategy
具体客户还可以调用setTool动态切换使用其他【策略对象】。
Sample的 handleUpdate 委托给 m_tool 的 handleUpdate。当m_tool改变的时候,其handleUpdate的相应的改变了。(ps:handleStep等函数类似)
可以对比看下状态模式