//所有鸭子的抽象类
abstract class Duck{
public $flyB;//为引用对象建立变量,飞行行为
public $quackB;//为引用对象建立变量,叫声行为
//执行飞行行为
public function performfly(){
$this->flyB->fly();
}
//执行叫声行为
public function performquack(){
$this->quackB->quack();
}
//所有鸭子都有的公共行为
public function swim(){
echo '所有的鸭子都会游泳';
}
//设定飞行行为类
public function setFlyB($a){
$this->flyB=$a;
}
//设定叫声行为类
public function setQuackB($a){
$this->quackB=$a;
}
}
//飞行行为接口
interface FlyB{
public function fly();
}
//建立三个飞行行为类实现接口
class FlyWithWings implements FlyB{
public function fly(){
echo '我在用翅膀飞';
echo '<br>';
}
}
class FlyNoWay implements FlyB{
public function fly(){
echo '我不会飞';
echo '<br>';
}
}
class FlyWithRocket implements FlyB{
public function fly(){
echo '我在用火箭飞';
echo '<br>';
}
}
//叫声行为接口
interface QuackB{
public function quack();
}
//建立三个叫声行为类实现接口
class QuackQuack implements QuackB{
public function quack(){
echo '嘎嘎';
echo '<br>';
}
}
class Mute implements QuackB{
public function quack(){
echo '我是哑巴';
echo '<br>';
}
}
class Squeak implements QuackB{
public function quack(){
echo '吱吱';
echo '<br>';
}
}
//建立一个模型鸭子
class ModelDuck extends Duck{
function __construct(){
$this->flyB = new FlyNoWay();//设定默认飞行行为
$this->quackB = new Mute();//设定默认叫声行为
}
}
$d = new ModelDuck();
$d->performfly();//调用飞行行为,输出:我不会飞
$d->performquack();//调用叫声行为,输出:我是哑巴
$d->setFlyB(new FlyWithRocket());//设定新的飞行行为类
$d->setQuackB(new Squeak());//设定新的叫声行为类
$d->performfly();//调用新的飞行行为,输出:我在用火箭飞
$d->performquack();//调用新的叫声行为,输出:吱吱
$d->setFlyB(new FlyWithWings());//设定新的飞行行为类
$d->setQuackB(new QuackQuack());//设定新的叫声行为类
$d->performfly();//调用新的飞行行为,输出:我在用翅膀飞
$d->performquack();//调用新的叫声行为,输出:嘎嘎
输出:
我不会飞
我是哑巴
我在用火箭飞
吱吱
我在用翅膀飞
嘎嘎