首先,来看定义,Strategy模式即策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
解释什么是算法族?算法族就是描述事物的一组具体行为类,本质上具有相似性,比如,都实现同一个接口,但具体实现方法不同。
优点:
  1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
  2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
  3、 遵守大部分GRASP原则和常用设计原则(多用组合,少用继承),高内聚、低偶合。
  缺点:
  1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

好了,其它不说了,上代码。以下是仿照Head First里面的策略模式写的php版
<?php
/*抽象duck类*/

abstract class Duck {
var $flyBehavior;
var $quackBehaivor;
function Duck() {
}

public function performFly() {
$this->flyBehavior->fly();
}
public function performQuack() {
$this->quackBehaivor->quack();
}
abstract function display();

public function swim() {
echo "all ducks can swim.<br>";
}

function setFlyBehavior(FlyBehavior $f) {
$this->flyBehavior = $f;  
}

function setQuackBehaivor(QuackBehavior $q) {
$this->quackBehaivor = $q;
}
}


//飞的行为类
    interface FlyBehavior {
public function fly();
}

//叫的行为类
interface QuackBehavior {
public function quack();
}

class FlyWithSwings implements  FlyBehavior{
function fly() {
echo "I can flying<br>";
}
}

class FlyWithNoSwings implements  FlyBehavior{
function fly() {
echo "I can't flying<br>";
}
}

/*把飞这种行为单独拿出来,可以给其它类使用;比如说,我创建一个火箭飞行类*/
class RoketFly implements FlyBehavior{
function fly() {
echo 'I\'m flying with a rocket.';
}
}

/*******************************************************具体quack类*/
class Quackq implements QuackBehavior {
function quack() {
echo "quack1<br>";               //嘎嘎的叫
}

class MuteQuack implements QuackBehavior {
function quack() {
echo "slience<br>";            //不叫
}
}
class Squeack implements QuackBehavior {
function quack() {
echo "Squeack<br>";            //吱吱的叫
}
}


/*具体的鸭子类----绿头鸭*/
class MalarDuck extends Duck{
function MalarDuck() {
$this->flyBehavior = new FlyWithSwings();
$this->quackBehaivor = new Quackq();
}

function display() {
echo 'I\'m a malar duck.';
}
}

$a = new MalarDuck();
$a->performFly();
$a->performQuack();
$a->display();
?>