策略模式

策略模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。

Ø 主要解决

在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

Ø 何时使用

一个系统有许多许多类,而区分它们的只是他们直接的行为。

Ø 优点

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性良好。

Ø 缺点

1、策略类会增多。

2、所有策略类都需要对外暴露。

Ø 应用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

Ø 实现

加、减、乘 的策略调用

Strategy.php

interface Strategy{  
    public function Operation($num1, $num2);  
}  

Substract.php(减法运算)

class Substract implements Strategy{  
    public function Operation($num1, $num2){  
        return (int)$num1 - (int)$num2;  
    }  
}  

Multiply.php(乘法运算)

class Multiply implements Strategy{  
    public function Operation($num1, $num2){  
        return (int)$num1 * (int)$num2;  
    }  
}  

Add.php(加法运算)

class Add implements Strategy{  
    public function Operation($num1, $num2){  
        return (int)$num1 + (int)$num2;  
    }  
}  

Context.php

class Context{  
    private $_Strategy;  
  
    public function __construct(Strategy $strategy){  
        $this->_Strategy = $strategy;  
    }  
  
    public function execute($num1, $num2){  
        return $this->_Strategy ->Operation($num1, $num2);  
    }  
}  

Demo.php 测试调用

$context = new App\Strategy\Context(new \App\Strategy\Substract());  
echo '5-2=';  
echo $context ->execute(5,2);  
  
echo '<br>5*2=';  
$context = new App\Strategy\Context(new \App\Strategy\Multiply());  
echo $context ->execute(5,2);  
  
echo '<br>5+2=';  
$context = new App\Strategy\Context(new \App\Strategy\Add());  
echo $context ->execute(5,2);  
 

结果:

5-2=3  
5*2=10  
5+2=7  
评论

0 条评论