装饰模式,用来装饰主体。核心在于具体的装饰类中,实现装饰方法前,会先实现被装饰类的方法。
<?php
class person{
function __construct($name){
echo $name."</br>";
}
}
abstract class decorate extends person{
abstract function show();
}
class xingxiangA extends decorate{
public $_decorate;
public function __construct($decorate){
if( $decorate instanceof decorate ){
$this->_decorate = $decorate;
}
}
public function show(){
if( $this->_decorate ) $this->_decorate->show();
echo "穿袜子</br>";
}
}
class xingxiangB extends decorate{
public $_decorate;
public function __construct($decorate){
if( $decorate instanceof decorate ){
$this->_decorate = $decorate;
}
}
public function show(){
if( $this->_decorate ) $this->_decorate->show();
echo "戴帽子</br>";
}
}
class xingxiangC extends decorate{
public $_decorate;
public function __construct($decorate){
if( $decorate instanceof decorate ){
$this->_decorate = $decorate;
}
}
public function show(){
if( $this->_decorate ) $this->_decorate->show();
echo "穿西服</br>";
}
}
class xingxiangD extends decorate{
public $_decorate;
public function __construct($decorate){
if( $decorate instanceof decorate ){
$this->_decorate = $decorate;
}
}
public function show(){
if($this->_decorate){
if( $this->_decorate ) $this->_decorate->show();
}
echo "穿裤子</br>";
}
}
new person("黄达君");
$a = new xingxiangA('');
$b = new xingxiangB($a);
$c = new xingxiangC($b);
$c->show();
echo "</br>";
new person("黄达君");
$b = new xingxiangB('');
$a = new xingxiangA($b);
$c = new xingxiangC($a);
$c->show();
?>