-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomposite.php
More file actions
199 lines (156 loc) · 4.41 KB
/
composite.php
File metadata and controls
199 lines (156 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
</head>
<body>
<?
/**
* Ao ler sobre o composite lembre-se do diagrama da UML
*
* Nada mais é do que uma classe pai que pode ter várias classes filhas.
* Essa classe pai precisa ter metodos de acessos: add, get, remove e display para seus filhos.
*/
// padrao abstrato
abstract class AbstractPrateleira
{
abstract function getBookInfo($previousBook);
abstract function getBookCount();
abstract function setBookCount($new_count);
abstract function addBook($oneBook);
abstract function removeBook($oneBook);
}
class OneBook extends AbstractPrateleira
{
private $title;
private $author;
function __construct($title, $author)
{
$this->title = $title;
$this->author = $author;
}
/**
* Retorna as informações de um livro
*/
function getBookInfo($bookToGet)
{
if (1 == $bookToGet) {
return "Título: " . $this->title . " - Autor: " . $this->author;
} else {
return FALSE;
}
}
function getBookCount()
{
return 1;
}
function setBookCount($newCount)
{
return FALSE;
}
function addBook($oneBook)
{
return FALSE;
}
function removeBook($oneBook)
{
return FALSE;
}
}
// padrao de projeto composite
class PrateleiraDeLivros extends AbstractPrateleira
{
private $oneBooks = array();
private $bookCount;
public function __construct()
{
$this->setBookCount(0);
}
public function getBookCount()
{
return $this->bookCount;
}
public function setBookCount($newCount)
{
$this->bookCount = $newCount;
}
public function getBookInfo($bookToGet)
{
if ($bookToGet <= $this->bookCount) {
return $this->oneBooks[ $bookToGet ]->getBookInfo(1);
} else {
return FALSE;
}
}
public function addBook($oneBook)
{
$this->setBookCount($this->getBookCount() + 1);
$this->oneBooks[ $this->getBookCount() ] = $oneBook;
return $this->getBookCount();
}
public function removeBook($oneBook)
{
$counter = 0;
while (++$counter <= $this->getBookCount())
{
if ($oneBook->getBookInfo(1) == $this->oneBooks[ $counter ]->getBookInfo(1))
{
for ($x = $counter; $x < $this->getBookCount(); $x++) {
$this->oneBooks[ $x ] = $this->oneBooks[ $x + 1 ];
}
$this->setBookCount($this->getBookCount() - 1);
}
}
return $this->getBookCount();
}
}
writeln("INICIO DO TESTE");
writeln('');
$firstBook = new OneBook('The Black BOOK', 'Adriano Waltrick');
writeln('(after creating first book) oneBook info: ');
writeln($firstBook->getBookInfo(1));
writeln('');
$secondBook = new OneBook('PHP Bible', 'Converse and Park');
writeln('(after creating second book) oneBook info: ');
writeln($secondBook->getBookInfo(1));
writeln('');
$thirdBook = new OneBook('Design Patterns', 'Nome Autor');
writeln('(after creating third book) oneBook info: ');
writeln($thirdBook->getBookInfo(1));
writeln('');
$books = new PrateleiraDeLivros();
$booksCount = $books->addBook($firstBook);
writeln('(after adding firstBook to books) PrateleiraDeLivros info : ');
writeln($books->getBookInfo($booksCount));
writeln('');
$booksCount = $books->addBook($secondBook);
writeln('(after adding secondBook to books) PrateleiraDeLivros info : ');
writeln($books->getBookInfo($booksCount));
writeln('');
$booksCount = $books->addBook($thirdBook);
writeln('(after adding thirdBook to books) PrateleiraDeLivros info : ');
writeln($books->getBookInfo($booksCount));
writeln('');
$booksCount = $books->removeBook($firstBook);
writeln('(after removing firstBook from books) PrateleiraDeLivros count : ');
writeln($books->getBookCount());
writeln('');
writeln('(after removing firstBook from books) PrateleiraDeLivros info 1 : ');
writeln($books->getBookInfo(1));
writeln('');
writeln('(after removing firstBook from books) PrateleiraDeLivros info 2 : ');
writeln($books->getBookInfo(2));
writeln('');
writeln('END TESTING COMPOSITE PATTERN');
function writeln($line_in)
{
echo $line_in . "<br/>";
}
/**
* - Quando for necessário manipular uma coleção de objetos
*
* - Bom uso em menus, diretórios, containers, etc.
*
*/
?>
</body>
</html>