观察者模式 <?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) ?>

浙公网安备 33010602011771号