<?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();
?>
php的策略模式
最新推荐文章于 2024-09-21 14:08:20 发布