组合模式:
<html>
<body>
<head>
<style>
body{font:12px verdana;font-weight:bold}
td{font:11px verdana;}
</style>
</head>
<?php
abstract class AbstractInstrument{
private $name;
private $category;
private $instruments=array();
public function add(AbstractInstrument $instrument){
array_push($this->instruments,$instrument);
}
public function remove(AbstractInstrument $instrument){
array_pop($this->instruments);
}
public function hasChildren(){
return (bool)(count($this->instruments)>0);
}
public function getChild($i){
return $this->instruments[$i];
}
public function getDescription(){
echo "-one-".$this->getName();
if($this->hasChildren()){
echo " which includes:<br>";
foreach($this->instruments as $instrument){
echo "<table cellspacing=5 border=0><tr><td> </td></tr>-";
$instrument->getDescription();
echo "</td></tr></table>";
}
}
}
public function setName($name){
$this->name=$name;
}
public function getName(){
return $this->name;
}
public function setCategory($Category){
$this->Category=$Category;
}
public function getCategory(){
return $this->Category;
}
}
class Guitar extends AbstractInstrument{
function __construct($name){
parent::setName($name);
parent::setCategory("guitars");
}
}
class DrumSet extends AbstractInstrument{
function __construct($name){
parent::setName($name);
parent::setCategory("drums");
}
}
class SnareDrum extends AbstractInstrument{
function __construct($name){
parent::setName($name);
parent::setCategory("snare drum");
}
}
class BaseDrum extends AbstractInstrument{
function __construct($name){
parent::setName($name);
parent::setCategory("Base Drum");
}
}
class Cymbal extends AbstractInstrument{
function __construct($name){
parent::setName($name);
parent::setCategory("cymbal");
}
}
$drums=new DrumSet("tama maple set");
$drums->add(new SnareDrum("snare drum"));
$drums->add(new BaseDrum("large bass drum"));
$cymbals=new Cymbal("zildjian cymbal set");
$cymbals->add(new cymbal("small crash"));
$cymbals->add(new cymbal("large high hat"));
$drums->add($cymbals);
$guitar=new Guitar("gibaon les paul");
echo "List of Instruments:<p>";
$drums->getDescription();
$guitar->getDescription();
?>
</body>
</html>
观察者模式
<?php
//观察者
interface Observer{
public function update(Observable $subject);
}
abstract class Widget implements Observer{
protected $internalData=array();
abstract public function draw();
public function update(Observable $subject){
$this->internalData=$subject->getData();
}
}
class BasicWidget extends Widget{
function __construct(){
}
public function draw(){
$html="<table border=1 width=130>";
$html.="<tr><td colspan=3 bgcolor=#cccccc>" .
"<b>Instrument Info<b></td></tr>";
$numRecords=count($this->internalData[0]);
for($i=0;$i<$numRecords;$i++){
$instms=$this->internalData[0];
$prices=$this->internalData[1];
$years=$this->internalData[2];
$html.="<tr><td>$instms[$i]</td><td>$prices[$i]</td><td>$years[$i]</td></tr>";
}
$html.="</table><br>";
echo $html;
}
}
//==================
//被观察者
abstract class Observable{
private $observers=array();
public function addObserver(Observer $observer){
array_push($this->observers,$observer);
}
public function notifyObservers(){
for($i=0;$i<count($this->observers);$i++){
$widget=$this->observers[$i];
$widget->update($this);
}
}
}
class DataSource extends Observable{
private $names;
private $prices;
private $years;
function __construct(){
$this->names=array();
$this->prices=array();
$this->years=array();
}
public function addRecord($name,$price,$year){
array_push($this->names,$name);
array_push($this->prices,$price);
array_push($this->years,$year);
}
public function getData(){
return array($this->names,$this->prices,$this->years);
}
}
//=============
$dat=new DataSource();
$widget=new BasicWidget();
$dat->addObserver($widget);
$dat->addRecord("drum","$12.95","1955");
$dat->addRecord("guitar","$13.95","2003");
$dat->addRecord("banjo","$100.95","1945");
$dat->addRecord("piano","$120.95","1999");
$dat->addRecord("fenqin","$10.95","2000");
$dat->notifyObservers();
$widget->draw();
?>