百度词条的解释
http://baike.baidu.com/view/2141079.htm
<?php
//策略模式
//抽象鸭子类
abstract class Duck {
private $duckName;
private $flyBehavior;
private $quackBehavior;
public function __set($key, $value) {
$this->$key = $value;
}
public function __get($key) {
if(isset($this->$key)) {
return $this->$key;
} else {
return NULL;
}
}
public function swim() {
return '鸭子都会游泳';
}
public function performFly() {
return $this->flyBehavior->fly();
}
public function performQuack() {
return $this->quackBehavior->quack();
}
public function setFlyBehavior(IFlyBehavior $flyBehavior) {
$this->flyBehavior = $flyBehavior;
}
public function setQuackBehavior(IQuackBehavior $quackBehavior) {
$this->quackBehavior = $quackBehavior;
}
public abstract function display();
}
//野鸭类
class MallardDuck extends Duck {
public function __construct() {
parent::setQuackBehavior(new QuackA());
parent::setFlyBehavior(new FlyWithWings());
}
public function display() {
return "我是一只野鸭子";
}
}
//红头鸭子类
class RedHeadDuck extends Duck {
public function __construct() {
parent::setQuackBehavior(new QuackB());
parent::setFlyBehavior(new FlyWithWings());
}
public function display() {
return "我是一只红头鸭";
}
}
//橡皮鸭子类
class RubberDuck extends Duck {
public function __construct() {
parent::setQuackBehavior(new QuackC());
parent::setFlyBehavior(new FlyNoWay());
}
public function display() {
return "我是一个橡皮鸭子";
}
}
//飞行方式接口
interface IFlyBehavior {
function fly();
}
//飞起来
class FlyWithWings implements IFlyBehavior {
public function fly() {
return '我飞了!';
}
}
//飞不了
class FlyNoWay implements IFlyBehavior {
public function fly() {
return '飞不起来!';
}
}
//叫
interface IQuackBehavior {
function quack();
}
//叫方式A
class QuackA implements IQuackBehavior {
function quack() {
return '哑哑';
}
}
//叫方式B
class QuackB implements IQuackBehavior {
function quack() {
return '嘎嘎';
}
}
//叫方式C
class QuackC implements IQuackBehavior {
function quack() {
return '吱吱';
}
}
//野鸭
$mallardDuck = new MallardDuck();
echo $mallardDuck->display();
//野鸭在飞
echo $mallardDuck->performFly();
//野鸭在叫
echo $mallardDuck->performQuack();
echo '<br/>';
//红头鸭子
$redHeadDuck = new RedHeadDuck();
echo $redHeadDuck->display();
echo $redHeadDuck->performFly();
echo $redHeadDuck->performQuack();
echo '<br/>';
//橡皮鸭子
$rubberDuck = new RubberDuck();
echo $rubberDuck->display();
echo $rubberDuck->performFly();
echo $rubberDuck->performQuack();
?>