定义
Stragegy, 它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
要点
- 策略模式是对
算法
的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换
。
UML

strategy
优点
策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。
缺点
- 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
- 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。),比如以下的实例。
php代码示范
举例说明
- 商场收银系统,对一件商品有多种促销活动,那么这几种促销活动的算法最终的目的就是为了得到商品最终价钱,它们还可以相互替换。
-
抽象策略角色
CashSuper,定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。策略类通常由一个接口或者抽象类实现。 -
具体策略角色
CashNormal/CashRebate/CashReturn,实现接口抽象类CashasSuper,提供具体的算法实现。 -
环境角色
CashContext 持有一个策略类的引用,最终给客户端调用 - PHP代码例子。