1
00:00:00,180 --> 00:00:00,810
Bienvenidos.

2
00:00:00,870 --> 00:00:05,700
Continuamos con el patrón de diseño compost, que es de la categoría estructurales.

3
00:00:05,790 --> 00:00:11,730
También se le conoce como compuesto o compositor y nos permite construir objetos complejos a partir

4
00:00:11,730 --> 00:00:17,040
de otros objetos más simples, pero que tengan en común alguna clase abstracta, alguna interfaz, es

5
00:00:17,040 --> 00:00:19,920
decir, que sean similares o del mismo tipo.

6
00:00:20,010 --> 00:00:24,840
Entonces, la idea o el problema que intenta solucionar es la recursividad, una estructura en forma

7
00:00:24,840 --> 00:00:25,170
de árbol?

8
00:00:25,230 --> 00:00:31,380
Exactamente lo mismo o muy parecido a lo que vimos en la sección anterior recursividad, pero una forma

9
00:00:31,380 --> 00:00:36,780
un poco más organizada con un patrón diseño, una clase abstracta con un método recursivo.

10
00:00:37,080 --> 00:00:40,160
Veamos el ejemplo, pero antes veamos el diagrama de clase.

11
00:00:40,320 --> 00:00:47,640
Acá tenemos la clase genérica abstracta gráfico con el método pintar recursivo y acá tenemos dos partes

12
00:00:47,640 --> 00:00:53,430
tenemos los componentes por ejemplo círculo, cuadrado, triángulo y tenemos un compuesto que va a estar

13
00:00:53,430 --> 00:00:57,360
formado o compuesto por estas clases, por los componentes.

14
00:00:57,630 --> 00:01:02,910
Entonces un grupo de imágenes está compuesto por un triángulo cuadrado o círculo o combinaciones de

15
00:01:02,910 --> 00:01:06,780
éstas, pero también podría estar compuesto por otro grupo de imágenes.

16
00:01:06,900 --> 00:01:13,290
Es decir, un grupo de imágenes está formado por otro grupo de imágenes y a su vez por esto de por los

17
00:01:13,290 --> 00:01:14,040
componentes.

18
00:01:14,550 --> 00:01:15,870
Y acá lo vemos en el grama.

19
00:01:16,020 --> 00:01:18,630
Todos son tipos de gráfico por herencias.

20
00:01:18,630 --> 00:01:25,410
Círculo hereda de gráfico cuadrado también, el triángulo también, pero grupo de imágenes también es

21
00:01:25,470 --> 00:01:26,370
hija de gráfico.

22
00:01:26,670 --> 00:01:33,870
Todos son gráfico y la clase compuesta o compositor contiene una lista de varios elementos del tipo

23
00:01:33,870 --> 00:01:34,320
gráfico.

24
00:01:34,410 --> 00:01:42,420
Está compuesto por varios gráfico, ya sea grupos o individuales se fijan y eso es finalmente recursiva,

25
00:01:42,480 --> 00:01:49,530
como por ejemplo podríamos tener una clase abstracta elemento o componente, una clase abstracta y clases

26
00:01:49,590 --> 00:01:54,240
hijas archivo por ejemplo archivo PDF o archivo excel.

27
00:01:54,390 --> 00:01:59,220
En fin, archivo da lo mismo y el compuesto sería el directorio.

28
00:01:59,340 --> 00:02:01,590
Un directorio está compuesto por archivos.

29
00:02:01,710 --> 00:02:06,360
Esto está perfecto, pero también puede estar compuesto por otro directorio que a su vez tienen archivos

30
00:02:06,480 --> 00:02:10,770
y lo importante que todos sobre describen el método pintar o dibujar.

31
00:02:11,190 --> 00:02:18,240
Acá en gráfico, en el ejemplo no sé de directorio va a tener el método recorrer o mostrar, pero en

32
00:02:18,240 --> 00:02:23,760
forma recursiva tenemos que iterar, recorrer directorio por directorio y mostrando las imágenes de

33
00:02:23,760 --> 00:02:27,420
cada uno y también por supuesto los directorios dentro de directorios.

34
00:02:27,570 --> 00:02:32,910
Bien, estamos en la página de Wikipedia, así que también tenemos la versión en inglés y acá tenemos

35
00:02:32,910 --> 00:02:39,420
un diagrama de clase un poco más estándar, por ejemplo, la clase abstracta componente con el método

36
00:02:39,420 --> 00:02:45,960
recursivo operación, por ejemplo, y acá tenemos el compuesto y el componente LIF sería el componente

37
00:02:46,380 --> 00:02:47,970
y composite el compuesto.

38
00:02:48,090 --> 00:02:53,790
El compuesto o composite va a estar formado por elementos del tipo componente, se fijan acá.

39
00:02:53,880 --> 00:03:00,840
El rombo entonces tiene un arreglo, una lista de tipos componente component.

40
00:03:01,140 --> 00:03:08,820
Pero recuerden el componen pueden ser un LIF o un compuesto o composite con el método operación método

41
00:03:08,820 --> 00:03:09,600
recursivo.

42
00:03:09,720 --> 00:03:14,370
Además, para agregar y eliminar elementos y para obtenerlos hijos la lista.

43
00:03:14,520 --> 00:03:20,550
En nuestro ejemplo el composer va a ser el directorio, el LIF va a ser archivo y ambos son del tipo

44
00:03:20,550 --> 00:03:21,180
componente.

45
00:03:21,390 --> 00:03:22,080
Vamos a verlo.

46
00:03:22,560 --> 00:03:25,350
Vamos a Cerrato derecho cerrar todo.

47
00:03:25,440 --> 00:03:27,450
Vamos a crear un package en patrones.

48
00:03:29,680 --> 00:03:30,330
Con poceta.

49
00:03:32,080 --> 00:03:33,000
Y decorar 2.

50
00:03:33,190 --> 00:03:34,750
Bueno, lo vamos a cerrar acá.

51
00:03:35,180 --> 00:03:37,090
Bien, vamos a crear nuestra clase.

52
00:03:37,300 --> 00:03:47,220
Componente componente una clase abstracta importante con un método abstracto.

53
00:03:48,010 --> 00:03:51,640
Abstract Public va a devolver un string.

54
00:03:51,760 --> 00:03:56,860
Aunque también podría ser un void, pero lo importante que recorra la estructura de árbol del directorio

55
00:03:56,980 --> 00:04:00,940
y vaya mostrando cada elemento, cada directorio o archivo.

56
00:04:01,120 --> 00:04:04,360
Le vamos a llamar mostrar, mostrar.

57
00:04:04,510 --> 00:04:05,410
Perfecto.

58
00:04:06,130 --> 00:04:12,220
Pero también va a tener atributos protected del tipo String nombre.

59
00:04:13,390 --> 00:04:14,740
Además, un constructor.

60
00:04:16,140 --> 00:04:19,830
Generad constructor con el nombre.

61
00:04:20,990 --> 00:04:22,190
Y el método документы?

62
00:04:23,700 --> 00:04:25,530
Generad Geet.

63
00:04:26,590 --> 00:04:31,840
Nombre Bueno, el set no sería necesario porque él lo pasamos por el constructor.

64
00:04:32,470 --> 00:04:34,720
Eso sería nuestra clase abstracta componente.

65
00:04:34,810 --> 00:04:38,480
Pero vamos a tener dos tipos el directorio y el archivo.

66
00:04:38,560 --> 00:04:42,020
Vamos a partir por el archivo new.

67
00:04:43,870 --> 00:04:46,390
Recuerden que ambos heredan de componente.

68
00:04:50,160 --> 00:04:54,330
Stents componente bien implementamos el método.

69
00:04:55,830 --> 00:05:00,050
Mostrar o constructo del padre también con generate.

70
00:05:02,320 --> 00:05:03,160
Constructor?

71
00:05:03,310 --> 00:05:03,670
Bien.

72
00:05:04,140 --> 00:05:10,250
Bueno, el mostrar es super simple porque es un solo archivo, solamente mostramos el nombre nombre.

73
00:05:10,630 --> 00:05:11,170
Nada más.

74
00:05:11,380 --> 00:05:13,000
Veamos cómo sería el directorio.

75
00:05:16,680 --> 00:05:25,050
Bueno, el territorio un poco más complicado vamos a heredar y lo mismo implementamos el método.

76
00:05:28,470 --> 00:05:29,210
Constructor.

77
00:05:33,890 --> 00:05:40,400
Pero además, va a tener una lista del tipo componente elementos hijos, ya que representa el compuesto

78
00:05:41,450 --> 00:05:44,840
privat list de componente.

79
00:05:47,400 --> 00:05:59,730
Hijos importábamos listo de lleba útil bien y en el constructor disputo inicializamos hijos igual New

80
00:06:00,360 --> 00:06:02,180
ArrayList está molesto.

81
00:06:03,060 --> 00:06:08,940
Bien, vamos a implementar el método agregar componente y eliminar componentes son importantes.

82
00:06:09,930 --> 00:06:23,330
Public void add component bien y que recibe un componente componente le vamos a llamarse hijos.

83
00:06:23,400 --> 00:06:25,950
Punto agregar le pasamos.

84
00:06:25,950 --> 00:06:27,180
Sé perfecto.

85
00:06:27,270 --> 00:06:31,860
Bien puede volver void, pero también podría devolver el mismo tipo directorio.

86
00:06:33,020 --> 00:06:34,370
Para que lo podamos encadenar.

87
00:06:34,490 --> 00:06:35,070
Se acuerdan?

88
00:06:35,210 --> 00:06:37,870
Entonces, por ejemplo, acá devolvemos 10.

89
00:06:39,750 --> 00:06:43,760
10 de acá el tipo de retorno sería un directorio.

90
00:06:45,440 --> 00:06:45,640
Bien.

91
00:06:45,710 --> 00:06:47,570
Ahí tenemos el agregar componente.

92
00:06:48,020 --> 00:06:49,400
Faltaría el eliminar.

93
00:06:51,170 --> 00:06:55,610
Public void lo dejamos en void porque elimina de a uno.

94
00:06:56,210 --> 00:06:59,150
Remu componente.

95
00:07:00,470 --> 00:07:04,350
Componente c hijos.

96
00:07:04,370 --> 00:07:04,940
Punto.

97
00:07:05,030 --> 00:07:05,690
Remove.

98
00:07:05,810 --> 00:07:09,740
Y pasamos el objeto c component para quitar de la lista.

99
00:07:10,190 --> 00:07:15,860
Pero recuerden que se puede eliminar por la instancia projeto lo que hace el list por debajo e buscar

100
00:07:15,950 --> 00:07:17,330
objeto por objeto de la lista.

101
00:07:17,420 --> 00:07:18,200
Iba comparando.

102
00:07:18,260 --> 00:07:18,970
Cuando lo encuentre.

103
00:07:18,980 --> 00:07:20,270
Cuando es igual lo elimina.

104
00:07:20,390 --> 00:07:26,080
Por lo tanto, tenemos que implementar el método equals con alguna regla donde el componente porque

105
00:07:26,240 --> 00:07:28,160
componente es lo que se va a eliminar.

106
00:07:28,910 --> 00:07:34,760
Entonces por acá podemos implementar el método equals y si estamos utilizando un set en vez de un list,

107
00:07:34,850 --> 00:07:38,370
acá un set implementamos el Ascot.

108
00:07:38,930 --> 00:07:39,500
Se acuerdan?

109
00:07:39,560 --> 00:07:40,640
Bueno, eso ya lo vimos.

110
00:07:41,210 --> 00:07:47,990
Así que con Ginette lo podemos hacer con el IDE y quarts y asco lo implementamos.

111
00:07:47,990 --> 00:07:51,650
Siguiente Bueno, el método equals va a comprar por nombre.

112
00:07:51,800 --> 00:07:56,390
Entonces cuando el nombre se igual es porque el objeto es considerado igual, idéntico.

113
00:07:57,330 --> 00:07:59,700
El asco también finaliza bien.

114
00:07:59,820 --> 00:08:02,810
Entonces todo método solamente para el remu.

115
00:08:03,000 --> 00:08:06,450
Para poder eliminar de la lista, aunque serían opcionales.

116
00:08:06,480 --> 00:08:09,210
Pero si lo queremos eliminar, lo tenemos que implementar.

117
00:08:11,110 --> 00:08:11,590
Qué más?

118
00:08:11,740 --> 00:08:12,730
Bueno, eso sería.

119
00:08:12,910 --> 00:08:15,820
Ahora continuamos con el método Mostrar el método recursivo.

120
00:08:17,240 --> 00:08:18,110
Devuelve un string.

121
00:08:18,380 --> 00:08:20,790
Entonces vamos a recorrer el árbol completo.

122
00:08:20,960 --> 00:08:25,980
Los directorios podrían utilizar un string builder String builder.

123
00:08:31,340 --> 00:08:36,950
Recuerden que este método mostrar en el objeto compuesto en este caso directorio es el método recursivo

124
00:08:37,070 --> 00:08:38,930
que también se le va a invocar a los hijos.

125
00:08:39,080 --> 00:08:44,210
Lo primero es mostrar el nombre, así que vamos a agregar al Eltren Builder.

126
00:08:44,330 --> 00:08:50,330
El nombre del directorio, entonces nombre, pero también append.

127
00:08:50,540 --> 00:08:57,620
Le vamos a concatenar o agregar un es latch porque digan el nombre del directorio es el DAT, así como

128
00:08:57,620 --> 00:08:58,220
carpeta.

129
00:08:58,640 --> 00:08:59,270
Perfecto.

130
00:09:00,770 --> 00:09:03,590
Luego un salto de línea.

131
00:09:03,710 --> 00:09:10,070
Saltamos una línea para simular un print line para mostrar los elementos hijos, un paquete larch n

132
00:09:10,970 --> 00:09:14,540
bean y luego un for un forillo.

133
00:09:15,170 --> 00:09:23,930
Los elementos hijos son del tipo componente entonces componente hijo 2 punto 10 punto hijos.

134
00:09:24,170 --> 00:09:26,180
La lista ya que te damos.

135
00:09:26,570 --> 00:09:33,890
Bueno, acá tenemos que llamar por cada hijo el método mostrar de forma recursiva ese punto happen y

136
00:09:33,890 --> 00:09:35,270
acá sería hijo.

137
00:09:36,440 --> 00:09:40,340
Punto mostrar punto happen.

138
00:09:41,780 --> 00:09:42,590
Un salto línea.

139
00:09:45,690 --> 00:09:47,790
Y devolvemos el string builder.

140
00:09:48,090 --> 00:09:51,310
Punto String, ese punto String.

141
00:09:52,380 --> 00:09:53,070
Ahora sí que sí.

142
00:09:53,310 --> 00:09:54,030
Ahí lo tenemos.

143
00:09:54,150 --> 00:09:56,000
Ahora lo tenemos que probar con la clase.

144
00:09:56,040 --> 00:09:56,850
Con el método Main.

145
00:09:57,000 --> 00:10:02,580
Ahora el único problema que vamos a tener es que estamos haciendo todos часто línea acá para el directorio

146
00:10:02,670 --> 00:10:03,720
y después por cada hijo.

147
00:10:04,200 --> 00:10:09,480
La idea de que este salto línea está solamente para lo del tipo archivo y no para directorio.

148
00:10:09,750 --> 00:10:16,470
Porque si no lo estaría duplicando directorio acá afuera y solamente para los tipos archivos acá.

149
00:10:16,620 --> 00:10:22,400
Claro, porque después si es un directorio mostrar se vuelve a invocar el mostrar y hace un salto línea

150
00:10:22,410 --> 00:10:26,190
se fijan como hace un salto línea vaquer repitio Bueno, pero igual veámoslo.

151
00:10:26,760 --> 00:10:29,790
Vamos a crear la clase con el método Main con posit.

152
00:10:31,180 --> 00:10:32,890
New Un package.

153
00:10:34,380 --> 00:10:46,050
Ejemplo de acá New Llévatelas, ejemplo Composer, ejemplo compositor OK.

154
00:10:46,220 --> 00:10:47,150
Con el método Main

155
00:10:50,240 --> 00:10:53,420
vamos a crear un directorio doc o raíz.

156
00:10:53,870 --> 00:10:59,300
Nuestro directorio principal new directorio te vamos a llamar.

157
00:10:59,390 --> 00:11:00,140
Documentos

158
00:11:03,590 --> 00:11:16,130
directorio yaba igual new directorio yaba bien llaba punto agregar componente.

159
00:11:16,820 --> 00:11:21,680
Vamos a agregar un archivo cual por ejemplo patrón composite.

160
00:11:26,360 --> 00:11:30,290
Punto doc doc x un cuarto perfecto.

161
00:11:30,590 --> 00:11:31,540
Entonces pruebe un momento.

162
00:11:31,550 --> 00:11:37,770
Tenemos dos directorios y solamente tenemos yaba entre trujillana y dentro el archivo doc.

163
00:11:38,090 --> 00:11:39,110
Patrón con poceta.

164
00:11:39,500 --> 00:11:43,670
Pero vamos a crear otro directorio más que lo vamos a guardar dentro de yaba.

165
00:11:44,870 --> 00:12:00,200
Directorio stream new directorio API stream el API stream otra carpeta tiene stream.

166
00:12:01,130 --> 00:12:07,610
Vamos a agregar un archivo a componente new archivo.

167
00:12:08,450 --> 00:12:11,220
Por ejemplo podría ser stream map.

168
00:12:12,950 --> 00:12:22,400
El operador map punto doc x se fijan estrema un archivo punto doc dentro del directorio stream.

169
00:12:23,300 --> 00:12:28,570
Lo estamos guardando bien, pero qué pasa con el directorio stream?

170
00:12:28,760 --> 00:12:29,690
Lo tenemos que pasar.

171
00:12:29,780 --> 00:12:32,600
Lo tenemos que agregar en el directorio yaba.

172
00:12:33,290 --> 00:12:33,570
Entonces.

173
00:12:34,130 --> 00:12:40,460
Punto add componente y pasamos estría se fijan.

174
00:12:40,520 --> 00:12:45,270
Entonces Yaba contiene ahora el archivo doc pero también el directorio stream.

175
00:12:45,470 --> 00:12:46,340
Acá lo estamos pasando.

176
00:12:46,430 --> 00:12:51,800
Se fija en yaba punto ad component stream y ya a punto de componer el archivo.

177
00:12:52,370 --> 00:12:59,870
Pero a su vez el territorio stream contiene el archivo extrem map y tenemos una profundida, una estructura

178
00:12:59,870 --> 00:13:00,290
de árbol.

179
00:13:00,590 --> 00:13:01,640
Ahora, qué pasa con Yaba?

180
00:13:02,270 --> 00:13:03,020
Este directorio.

181
00:13:03,990 --> 00:13:10,500
Se lo pasamos adhoc, entonces Documentos va a contener el directorio yaba con toda esta estructura.

182
00:13:12,690 --> 00:13:22,860
Doc punto al componente Yaba, pero también al raíz o doc le podrían agregar un par de archivo para

183
00:13:22,860 --> 00:13:33,330
complementar, por ejemplo, un currículo new archivo se ve punto doc x un curriculum vitae.

184
00:13:34,080 --> 00:13:45,930
Además va a tener at componente new archivo, por ejemplo logo, punto jpg, una imagen en la raíz y

185
00:13:45,930 --> 00:13:46,290
listo.

186
00:13:46,380 --> 00:13:47,340
Ahí tenemos la estructura.

187
00:13:47,970 --> 00:13:49,960
Veamos cómo sería entonces Shout.

188
00:13:50,190 --> 00:13:56,910
Recordemos que el método recursivo mostrar devuelve un string doc que sería nuestra carpeta directorio

189
00:13:56,910 --> 00:13:59,310
principal o raíz punto mostrar.

190
00:13:59,970 --> 00:14:09,270
Recuerden que doc acá aparte de todo doc en la raíz doc contiene yaba que a su vez yaba este acá contiene

191
00:14:09,360 --> 00:14:14,020
el archivo patrón con poceta y contiene el directorio stream.

192
00:14:14,600 --> 00:14:18,630
Acá acá estamos agregando que a su vez tiene un archivo extrem map.

193
00:14:20,210 --> 00:14:20,810
Vamos a ver.

194
00:14:26,210 --> 00:14:34,130
Veamos se fijan documentos, contiene yaba, contiene bueno, ya contiene el patrón con posit y a su

195
00:14:34,130 --> 00:14:36,680
vez Yaba contiene el API stream conectÃ archivo.

196
00:14:37,690 --> 00:14:44,520
El documento contiene estos dos archivos, si se fijan, acá se genera un salto línea de más y eso lo

197
00:14:44,520 --> 00:14:47,100
podemos solucionar acá, como explicaba.

198
00:14:47,250 --> 00:14:54,290
Voy a colocar acá el punto y coma y acá con un if if solamente para los tipos que sean archivo.

199
00:14:54,420 --> 00:15:02,010
Entonces si el hijo enestas off de archivo perfecto.

200
00:15:04,990 --> 00:15:07,420
SB Punto happen.

201
00:15:08,510 --> 00:15:13,730
Se fijan entonces solamente si es del tipo archivo elijo y no directorio.

202
00:15:14,360 --> 00:15:18,650
Porque acá estamos haciendo salto línea en directorio solamente si es archivo.

203
00:15:19,010 --> 00:15:20,000
Hacemos un trato línea.

204
00:15:21,240 --> 00:15:21,840
Vamos a ver.

205
00:15:26,050 --> 00:15:27,130
Se fijan que mucho mejor.

206
00:15:27,850 --> 00:15:29,470
Ahora le podríamos dar profundidad.

207
00:15:29,590 --> 00:15:30,310
Niveles?

208
00:15:30,440 --> 00:15:31,060
Bueno, cómo?

209
00:15:31,180 --> 00:15:31,820
Súper simple.

210
00:15:32,080 --> 00:15:34,330
Nos vamos a ir a componente por acá.

211
00:15:35,020 --> 00:15:41,680
Vamos a modificar el método abstracto en la clase tracta componente int nivel muy.

212
00:15:41,680 --> 00:15:43,810
Parecióle que hicimos también en recursividad.

213
00:15:43,900 --> 00:15:44,800
Exactamente lo mismo.

214
00:15:45,250 --> 00:15:47,890
Ahora modificamos el archivo acá.

215
00:15:48,340 --> 00:15:50,170
Int nivel.

216
00:15:51,320 --> 00:15:57,440
De acá le damos el nivel, por ejemplo, vamos a concatenar más un tabulador.

217
00:15:57,770 --> 00:16:01,080
Punto, repito, cuántas veces?

218
00:16:01,220 --> 00:16:02,480
Bueno, según nivel.

219
00:16:04,730 --> 00:16:05,750
Y lo mismo en territorio.

220
00:16:05,870 --> 00:16:06,200
Acá.

221
00:16:07,220 --> 00:16:15,680
Mostrar int nivel antes que nada, vamos a agregar acá al tabulador en el tren Builders, en el constructor

222
00:16:16,370 --> 00:16:25,040
baxa Larch, una thé punto repite nivel yaca en los hijos sería nivel +1.

223
00:16:26,090 --> 00:16:26,660
Eso es todo.

224
00:16:27,290 --> 00:16:28,370
Solamente faltaría.

225
00:16:28,460 --> 00:16:31,310
Ejemplo Composite y acá sería nivel 0.

226
00:16:32,460 --> 00:16:33,030
Nada más.

227
00:16:36,180 --> 00:16:38,150
Un documento contiene hallaba.

228
00:16:39,570 --> 00:16:42,900
Curriculum vitae y logo, pero ya va.

229
00:16:42,930 --> 00:16:49,020
Contiene el patrón composite Doc API Stream que sube, contiene el archivo Stream Maputo Doc.

230
00:16:49,180 --> 00:16:54,300
Bien, por ahora sería eso muy similar a lo que ya vimos en la sección de recursividad, pero implementado

231
00:16:54,300 --> 00:17:01,410
de forma similar utilizando el patrón composite, usando una clase abstracta y un método recursivo dentro

232
00:17:01,500 --> 00:17:02,280
del componente.

233
00:17:02,400 --> 00:17:03,830
Nos vemos en la siguiente clase.
