php 设计模式

组合模式:

<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(); 
?>


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值