php来实现书中的示例和习题,昨天完成策略模式和观察者模式,代码如下:

<?php
    
interface FlyBehavior
    {
        
function fly();
    }
    
interface QuackBehavior
    {
        
function quack();
    }
    
class FlyWithWings implements FlyBehavior
    {    
        
public function fly() 
        {
            
print("fly with wings\n");
        }
    }
    
class FlyNoWay implements FlyBehavior
    {
        
public function fly()
        {
            
print("fly no way\n");
        }
    }
    
class Quack implements QuackBehavior
    {
        
public function quack()
        {        
            
print("quack,gua,gua\n");
        }
    }
    
abstract class Duck
    {
        
protected $flyBehavior = null;
        
protected $quackBehaviro = null;
        
public function __construct(FlyBehavior $flyBehavior = null, QuackBehavior $quackBehavior = null)
        {
            
$this->setFlyBehavior($flyBehavior);
            
$this->setQuackBehavior($quackBehavior);
        }
        
public function fly() 
        {
            
$this->flyBehavior->fly();
        }
        
public function quack()
        {
            
$this->quackBehavior->quack();    
        }
        
public function getFlyBehavior()
        {
            
return $flyBehavior;
        }
        
public function setFlyBehavior(FlyBehavior $fly)
        {
            
$this->flyBehavior = $fly;
        }
        
public function getQuackBehavior()
        {
            
return $quackBehavior;
        }
        
public function setQuackBehavior(QuackBehavior $quack)
        {
            
$this->quackBehavior = $quack;
        }
        
abstract public function display();
    }
    
class RedheadDuck extends Duck
    {
        
public function __construct(FlyBehavior $flyBehavior = null, QuackBehavior $quackBehavior = null)
        {
            parent
::__construct($flyBehavior, $quackBehavior);
        }
        
public function display()
        {
            
print("damn it! RedheadDuck display()\n");
        }
    }
    
$duck = new RedheadDuck();
    
$duck->setFlyBehavior(new FlyWithWings());
    
$duck->setQuackBehavior(new Quack());
    
$duck->fly();
    
$duck->quack();
    
$duck->display();
?>

相关文章: