组合模式,我的理解就是:一个对象内部可以包含很多种类型的对象,并且被包含的这些对象同样有这个属性,都拥有相同的操作。
比如文件系统,目录A下面有B目录和C目录,B目录下有D目录和E目录。
可以对A目录进行重命名、删除、移动和复制等操作,与此同时可以对B、C、D、E目录进行同样的操作,并且在移动目录的时候,可以将B目录下D目录移动到A目录下,结果就是与B同级。
<?php abstract class FileSystem{ abstract function add(FileSystem $fs); abstract function scan(); } class Dir extends FileSystem{ public $fs = array(); public $name; public function __construct($name){ $this->name = $name; } function add(FileSystem $fs){ if( in_array($fs, $this->fs, true) ){ return; } $this->fs[] = $fs; } function scan(){ foreach($this->fs as $dir){ $dir->scan(); } } } class ZipFile extends FileSystem{ public $fs = array(); public $name; public function __construct($name){ $this->name = $name; } function add(FileSystem $fs){ if( in_array($fs, $this->fs, true) ){ return; } $this->fs[] = $fs; } function scan(){ foreach($this->fs as $dir){ $dir->scan(); } } } class File extends FileSystem{ public $name; public function __construct($name){ $this->name = $name; } function add(FileSystem $fs){ echo "this is file ,can't add some file or dir to this file "; } function scan(){ echo "this is file $this->name "; return; } } $zip = new ZipFile("zip"); $zip->add(new File("xyz")); $zip->add(new File("abc")); echo '遍历$zip目录下的文件'." "; $zip->scan(); /* 遍历$zip目录下的文件 this is file xyz this is file abc */ echo " "; $dirA = new Dir("dirA"); $dirA->add(new File("php")); $dirA->add($zip); echo '遍历$dirA目录下的文件'." "; $dirA->scan(); /* 遍历$dirA目录下的文件 this is file php this is file xyz this is file abc */ echo " "; $dirB = new Dir("dirB"); $dirB->add(new File("Js")); $dirA->add($dirB); echo '遍历添加dirB之后的$dirA目录下的文件'." "; $dirA->scan(); /* 遍历添加dirB之后的$dirA目录下的文件 this is file php this is file xyz this is file abc this is file Js */