[php]php设计模式 Composite (组合模式)

1 php
2 /* *
3 * 组合模式
4 *
5 * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性
6 */
7 abstract class MenuComponent
8 {
9 public function add( $component ){}
10 public function remove( $component ){}
11 public function getName(){}
12 public function getUrl(){}
13 public function display(){}
14 }
15
16 class Menu extends MenuComponent
17 {
18 private $_items = array ();
19 private $_name = null ;
20
21 public function __construct( $name )
22 {
23 $this -> _name = $name ;
24 }
25
26 public function add( $component )
27 {
28 $this -> _items[] = $component ;
29 }
30
31 public function remove( $component )
32 {
33 $key = array_search ( $component , $this -> _items);
34 if ( $key !== false ) unset ( $this -> _items[ $key ]);
35 }
36
37 public function display()
38 {
39 echo " -- " . $this -> _name . " ---------
" ;
40 foreach ( $this -> _items as $item )
41 {
42 $item -> display();
43 }
44 }
45 }
46
47 class Item extends MenuComponent
48 {
49 private $_name = null ;
50 private $_url = null ;
51
52 public function __construct( $name , $url )
53 {
54 $this -> _name = $name ;
55 $this -> _url = $url ;
56 }
57
58 public function display()
59 {
60 echo $this -> _name . " # " . $this -> _url . "
" ;
61 }
62 }
63
64 class Client
65 {
66 private $_menu = null ;
67
68 public function __construct( $menu )
69 {
70 $this -> _menu = $menu ;
71 }
72
73 public function setMenu( $menu )
74 {
75 $this -> _menu = $menu ;
76 }
77
78 public function displayMenu()
79 {
80 $this -> _menu -> display();
81 }
82 }
83
84 // 实例一下
85 // 创建menu
86 $subMenu1 = new Menu( " sub menu1 " );
87 $subMenu2 = new Menu( " sub menu2 " );
88 $subMenu3 = new Menu( " sub menu3 " );
89
90 $item1 = new Item( " 163 " , " www.163.com " );
91 $item2 = new Item( " sina " , " www.sina.com " );
92
93 $subMenu1 -> add( $item1 );
94 $subMenu1 -> add( $item2 );
95
96 $item3 = new Item( " baidu " , " www.baidu.com " );
97 $item4 = new Item( " google " , " www.google.com " );
98 $subMenu2 -> add( $item3 );
99 $subMenu2 -> add( $item4 );
100
101 $allMenu = new Menu( " All Menu " );
102 $allMenu -> add( $subMenu1 );
103 $allMenu -> add( $subMenu2 );
104 $allMenu -> add( $subMenu3 );
105
106 $objClient = new Client( $allMenu );
107 $objClient -> displayMenu();
108
109 $objClient -> setMenu( $subMenu2 );
110 $objClient -> displayMenu();

你可能感兴趣的:(php,设计模式)