- 简单工厂
<?php
# 简单工厂
abstract class mycoach
{
public function __construct(){}
}
class cultivatecpc extends mycoach{
public function __construct(){
echo "把陈培昌培养为搏击教练"."
";
}
}
class cultivatecj extends mycoach{
public function __construct(){
echo "把程劲培养为搏击教练"."
";
}
}
class martialclub
{
public function cultivate($name)
{
switch($name){
case 'cj':
return new cultivatecj();
case 'cpc':
return new cultivatecpc();
default:
echo '培养一个小教练'."
";
break;
}
return null;
}
}
class clubmaster{
public function cultivate()
{
$myclub = new martialclub();
$myclub->cultivate('cj');
$myclub = new martialclub();
$myclub->cultivate('cpc');
}
}
$mymaster = new clubmaster();
$mymaster->cultivate();
输出结果:
把程劲培养为搏击教练
把陈培昌培养为搏击教练
- (复杂)工厂
<?php
abstract class mycoach
{
public function __construct()
{}
}
class cpc extends mycoach
{
public function __construct()
{
echo "培养出了搏击教练昌仔"."
";
}
}
class cj extends mycoach
{
public function __construct()
{
echo "培养出了搏击教练劲儿弟弟"."
";
}
}
interface cultivate{
function cultivate();
}
class cultivatecpc implements cultivate
{
public function cultivate()
{
return new cpc();
}
}
class cultivatecj implements cultivate
{
public function cultivate()
{
return new cj();
}
}
class coach{
public function __construct()
{
$coach = new cultivatecpc();
$coach->cultivate();
$coach = new cultivatecj();
$coach->cultivate();
}
}
$littlecoach = new coach();
输出结果:
培养出了搏击教练昌仔
培养出了搏击教练劲儿弟弟
- 观察者模式
<?php
class watcher
{
private $name;
public function __construct($myname){
$this->name=$myname;
}
public function update($food)
{
switch($food)
{
case '奶油蛋糕':
echo $food."上桌了,".$this->name.'取出了一份纸盘子和塑料叉子,切了一块'."
";
break;
case '烤鸭':
echo $food."上桌了,".$this->name.'取了张薄饼,夹了些许葱丝,刷了些甜面酱'."
";
break;
default:
echo $food."上桌了,".$this->name."赶紧加了两筷子"."
";
break;
}
return null;
}
}
class watchee
{
private $watchlist = [];
public function addwatcher($watcher)
{
$this->watchlist[]=$watcher;
}
public function removewatcher($watcher)
{
$target = array_search($watcher,$this->watchlist);
$target = (int)$target;
unset($this->watchlist[$target]);
//echo $target."
";
}
public function loaddish($dishname)
{
$this->notify($dishname);
}
public function notify($dishname)
{
#这里推荐用foreach循环,for循环带来的陷阱是,如果以数字为索引,执行removewatcher方法后,有些索引就没了,访问不到就会报错
foreach($this->watchlist as $k=>$v)
{
$this->watchlist[$k]->update($dishname);
}
}
}
$cpc = new watcher('陈培昌');
$cj = new watcher('程劲');
$observee = new watchee();
$observee->addwatcher($cpc);
$observee->addwatcher($cj);
$observee->loaddish('葱香四川凉面');
$observee->removewatcher($cj);
$observee->loaddish('奶油蛋糕');
$xxd = new watcher('徐晓冬');
$observee->addwatcher($xxd);
$observee->loaddish('避风塘茄子');
输出结果:
葱香四川凉面上桌了,陈培昌赶紧加了两筷子
葱香四川凉面上桌了,程劲赶紧加了两筷子
奶油蛋糕上桌了,陈培昌取出了一份纸盘子和塑料叉子,切了一块
避风塘茄子上桌了,陈培昌赶紧加了两筷子
避风塘茄子上桌了,徐晓冬赶紧加了两筷子