php的策略模式

<?php
/**
 * 策略模式
 * 定义了算法族,分别封装起来,让它们之间可以互相替换,
 * 此模式让算法的变化独立于使用算法的客户。
 */
//飞行行为接口
interface FlyBehavior {
    public function fly();
}
//呱呱叫行为接口
interface QuackBehavior {
    public function quack();
}
//翅膀飞行
class FlyWithWings implements FlyBehavior {
    public function fly() {
        echo"I'm flying!!n";
    }
}
//不会飞
class FlyNoWay implements FlyBehavior {
    public function fly() {
        echo"I can't fly!n";
    }
}
class FlyRocketPowered implements FlyBehavior {
    public function fly() {
        echo"I'm flying with a rocket!n";
    }
}
class Qquack implements QuackBehavior {
    public function quack() {
        echo"Quackn";
    }
}
class Squeak implements QuackBehavior {
    public function quack() {
        echo"Squeakn";
    }
}
class MuteQuack implements QuackBehavior {
    public function quack() {
        echo"<< Silence >>n";
    }
}
abstract class Duck {
    protected $quack_obj;
    protected $fly_obj;
    public abstract function display();
  
    public function performQuack() {
        $this->quack_obj->quack();
    }
    public function performFly() {
        $this->fly_obj->fly();
    }
    public function swim() {
        echo"All ducks float, even decoys!n";
    }
    public function setFlyBehavior(FlyBehavior $fb) {
        $this->fly_obj =$fb;
    }
    public function setQuackBehavior(QuackBehavior $qb) {
        $this->quack_obj =$qb;
    }
}
  
class ModelDuck extends Duck {
    public function __construct() {
        $this->fly_obj =new FlyNoWay();
        $this->quack_obj =new MuteQuack();
    }
    public function display() {
        echo"I'm a model duck!n";
    }
}
  
$model= new ModelDuck();
$model->performFly();
$model->performQuack();
//提供新的能力
$model->setFlyBehavior(newFlyRocketPowered());
$model->setQuackBehavior(newSqueak());
$model->performFly();
$model->performQuack();
  
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值