设计模式-策略模式
在策略模式中,一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式,它让算法的变化独立于使用算法的客户。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
它是定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,解决在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护。将这些算法封装成一个一个的类,它实现同一个接口,任意地替换。
使用场景:把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中单独取出来,用接口进行单独的封装,封装好了接口,通过指定不同的接口实现类进行算法的变化。
它的优点:
1、算法可以自由切换
2、避免使用多重条件判断
3、扩展性良好
首先声明策略的接口文件,约定了策略的包含的行为,然后定义各个具体的策略实现类。通过接口方式,使得类与类之间不直接依赖。在使用该类的时候,才动态地传入该接口的一个实现类。如果要替换某个类,只需要提供一个实现了该接口的实现类,通过修改一行代码即可完成替换。
<?php /** * 策略模式 */ interface Math{ public function calc($op1,$op2); } class MathAdd implements Math{ public function calc($op1, $op2){ return $op1+$op2; } } class MathSub implements Math{ public function calc($op1, $op2){ return $op1-$op2; } } class MathMul implements Math{ public function calc($op1, $op2){ return $op1*$op2; } } class MathDiv implements Math{ public function calc($op1, $op2){ return $op1/$op2; } } class computer{ private $math=null; public function __construct($math){ $mathclass='Math'.$math; $this->math=new $mathclass(); } public function getResult($op1,$op2){ return $this->math->calc($op1,$op2); } }