没想到啊

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
观察者模式 
<?php 
/** 
* 观察者模式 
* 定义了对象之间的一对多依赖,当一个对象改变状态时, 
* 它的所有依赖者都会收到通知并自动更新。 
*/ 
interface Subject { 
public function registerObserver(Observer $o); 
public function removeObserver(Observer $o); 
public function notifyObservers(); 
} 
interface Observer { 
public function update($temperature, $humidity, $pressure); 
} 
interface DisplayElement { 
public function display(); 
} 
class WeatherData implements Subject { 
private $observers = array(); 
private $temperature; 
private $humidity; 
private $pressure; 
public function __construct() { 
$this->observers = array(); 
} 
public function registerObserver(Observer $o) { 
$this->observers[] = $o; 
} 
public function removeObserver(Observer $o) { 
if (($key = array_search($o, $this->observers)) !== false) { 
unset($this->observers[$key]); 
} 
} 
public function notifyObservers() { 
foreach ($this->observers as $observer) { 
$observer->update($this->temperature, $this->humidity, $this->pressure); 
} 
} 
public function measurementsChanged() { 
$this->notifyObservers(); 
} 
public function setMeasurements($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->pressure = $pressure; 
$this->measurementsChanged(); 
} 
} 
class CurrentConditionsDisplay implements Observer, DisplayElement { 
private $temperature; 
private $humidity; 
private $weatherData; 
public function __construct(Subject $weatherData) { 
$this->weatherData = $weatherData; 
$weatherData->registerObserver($this); 
} 
public function update($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->display(); 
} 
public function display() { 
echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%\n"; 
} 
} 
class StatistionsDisplay implements Observer, DisplayElement { 
private $temperature; 
private $humidity; 
private $pressure; 
private $weatherData; 
public function __construct(Subject $weatherData) { 
$this->weatherData = $weatherData; 
$weatherData->registerObserver($this); 
} 
public function update($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->pressure = $pressure; 
$this->display(); 
} 
public function display() { 
echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%; 气压:" . $this->pressure . "\n"; 
} 
} 
$weatherData = new WeatherData(); 
$currentDisplay = new CurrentConditionsDisplay($weatherData); 
$statistionDisplay = new StatistionsDisplay($weatherData); 
$weatherData->setMeasurements(10, 20, 30); 
$weatherData->removeObserver($currentDisplay); 
$weatherData->setMeasurements(30, 40, 50); 
?> 

命令模式 
复制代码 代码如下:

<?php 

class Light { 
public function __construct() { 

} 

public function on() { 
echo "Light On\n"; 
} 

public function off() { 
echo "Light Off\n"; 
} 
} 

interface Command { 
public function execute(); 
} 

class LightOnCommand implements Command { 
public $light; 

public function __construct(Light $light) { 
$this->light = $light; 
} 

public function execute() { 
$this->light->on(); 
} 
} 

class SimpleRemoteControl { 
public $slot; 

public function __construct() { 

} 

public function setCommand(Command $command) { 
$this->slot = $command; 
} 

public function buttonWasPressed() { 
$this->slot->execute(); 
} 
} 

class RemoteControlTest { 
public static function main() { 
$remote = new SimpleRemoteControl(); 
$light = new Light(); 
$lightOn = new LightOnCommand($light); 
$remote->setCommand($lightOn); 
$remote->buttonWasPressed(); 
} 
} 

RemoteControlTest::main(); 

?> 

装饰者模式 
复制代码 代码如下:

<?php 
/** 
* 装饰着模式 
* 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 
*/ 
abstract class Beverage { 
public $description = "Unknown Beverage"; 

public function getDescription() { 
return $this->description; 
} 

public abstract function cost(); 
} 

abstract class CondimentDecorator extends Beverage { 
//JAVA代码里这里是个抽象类,PHP不允许这么做 
public function getDescription() { 
return $this->description; 
} 
} 

class Espresso extends Beverage { 
public function __construct() { 
$this->description = "Espresso"; 
} 

public function cost() { 
return 1.99; 
} 
} 

class HouseBlend extends Beverage { 
public function __construct() { 
$this->description = "HouseBlend"; 
} 

public function cost() { 
return .89; 
} 
} 

class DarkRoast extends Beverage { 
public function __construct() { 
$this->description = "DarkRoast"; 
} 

public function cost() { 
return .99; 
} 
} 

class Mocha extends CondimentDecorator { 
public $beverage; 

public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Mocha"; 
} 
public function cost() { 
return .20 + $this->beverage->cost(); 
} 
} 

class Whip extends CondimentDecorator { 
public $beverage; 

public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Whip"; 
} 
public function cost() { 
return .10 + $this->beverage->cost(); 
} 
} 

class Soy extends CondimentDecorator { 
public $beverage; 

public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Soy"; 
} 
public function cost() { 
return .15 + $this->beverage->cost(); 
} 
} 

$beverage = new Espresso(); 
echo $beverage->getDescription() . "\n"; 
$beverage2 = new DarkRoast(); 
$beverage2 = new Mocha($beverage2); 
$beverage2 = new Mocha($beverage2); 
$beverage2 = new Whip($beverage2); 
echo $beverage2->getDescription() . " $" . $beverage2->cost() . "\n"; 

$beverage3 = new HouseBlend(); 
$beverage3 = new Soy($beverage3); 
$beverage3 = new Mocha($beverage3); 
$beverage3 = new Whip($beverage3); 
echo $beverage3->getDescription() . " $" . $beverage3->cost() . "\n"; 
?> 

状态模式 
复制代码 代码如下:

<?php 

class GumballMachine { 
const SOLD_OUT = 0; 
const NO_QUARTER = 1; 
const HAS_QUARTER = 2; 
const SOLD = 3; 

public $state = self::SOLD_OUT; 
public $count = 0; 

public function __construct($count) { 
$this->count = $count; 
if ($count > 0) { 
$this->state = self::NO_QUARTER; 
} 
} 

public function insertQuarter() { 
if ($this->state == self::HAS_QUARTER) { 
echo "You can't insert another quarter!\n"; 
} else if ($this->state == self::NO_QUARTER) { 
$this->state = self::HAS_QUARTER; 
echo "You inserted a quarter!\n"; 
} else if ($this->state == self::SOLD_OUT) { 
echo "You can't insert a quarter, the machine is sold out!\n"; 
} else if ($this->state == self::SOLD) { 
echo "Please wait, we're already giving you a gumball!\n"; 
} 
} 
} 

$obj = new GumballMachine(0); 
print_r($obj) 

?> 
posted on 2012-05-29 11:39  没想到啊  阅读(168)  评论(0)    收藏  举报