Builder de notícias com Director
classDiagram
direction TB
class Cliente
class NoticiaDirector {
-builder: NoticiaBuilder
+NoticiaDirector(builder: NoticiaBuilder)
+setBuilder(builder: NoticiaBuilder) void
+construirPersonalizada(titulo: String, subtitulo: String, categoria: String, capa: Imagem, autor: Autor, roteiro: List~ItemRoteiro~, fonte: String) void
+construirNoticiaPadrao(titulo: String, categoria: String, capa: Imagem, autor: Autor, texto: String) void
-validar(roteiro: List~ItemRoteiro~) void
}
class ItemRoteiro {
+tipo: TipoBloco
+conteudo: Object
}
class TipoBloco {
<<enumeration>>
TEXTO
IMAGEM
CARROSSEL
TOPICOS
}
class NoticiaBuilder {
<<interface>>
+reset() void
+definirCabecalho(titulo: String, categoria: String, capa: Imagem) void
+definirSubtitulo(subtitulo: String) void
+definirAutor(autor: Autor) void
+adicionarTexto(texto: String) void
+adicionarImagem(img: Imagem) void
+adicionarCarrossel(imgs: List~Imagem~) void
+adicionarTopicos(itens: List~String~) void
+definirRodape(fonte: String) void
+getResultado() Noticia
}
class NoticiaDestaqueBuilder {
-noticia: Noticia
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class NoticiaCompactaBuilder {
-noticia: Noticia
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class NoticiaMistaBuilder {
-noticia: Noticia
-posicaoTitulo: PosicaoTitulo
+NoticiaMistaBuilder(posicaoTitulo: PosicaoTitulo)
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarImagem(img) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class PosicaoTitulo {
<<enumeration>>
SUPERIOR_ESQUERDA
SUPERIOR_DIREITA
INFERIOR_ESQUERDA
INFERIOR_DIREITA
CENTRO
}
class Noticia {
-titulo: String
-subtitulo: String
-categoria: String
-capa: ImagemBloco
-posicaoTitulo: PosicaoTitulo
-autor: Autor
-dataCriacao: Date
-blocos: List~Bloco~
-rodape: String
+Noticia()
+adicionar(b: Bloco) void
+getDataCriacao() Date
+renderizar() String
}
class Autor {
-nome: String
-foto: String
+getNome() String
+getFoto() String
}
note for Noticia "dataCriacao é gerada automaticamente\nno construtor (new Date()): nem o\nCliente nem o Builder informam a data"
note for NoticiaMistaBuilder "título e subtítulo ficam sobre a capa,\nna posição recebida no construtor"
class Bloco {
<<abstract>>
+renderizar() String
}
class TextoBloco
class ImagemBloco {
-url: String
-legenda: String
-largura: int
}
class CarrosselBloco {
-imagens: List~Imagem~
-modo: String
}
class Imagem {
+url: String
+legenda: String
}
class TopicosBloco
Cliente --> NoticiaDirector : usa
Cliente ..> NoticiaDestaqueBuilder : escolhe um
Cliente ..> NoticiaCompactaBuilder : escolhe um
Cliente ..> NoticiaMistaBuilder : escolhe um e a posição
Cliente ..> ItemRoteiro : monta o roteiro
Cliente ..> Autor : informa o autor
NoticiaDirector o--> NoticiaBuilder : builder
NoticiaDirector ..> ItemRoteiro : lê e valida
ItemRoteiro --> TipoBloco
NoticiaBuilder <|.. NoticiaDestaqueBuilder
NoticiaBuilder <|.. NoticiaCompactaBuilder
NoticiaBuilder <|.. NoticiaMistaBuilder
NoticiaDestaqueBuilder --> Noticia : constrói
NoticiaCompactaBuilder --> Noticia : constrói
NoticiaMistaBuilder --> Noticia : constrói
NoticiaMistaBuilder --> PosicaoTitulo
Noticia *-- Bloco
Noticia --> Autor : escrita por
Noticia --> PosicaoTitulo
Bloco <|-- TextoBloco
Bloco <|-- ImagemBloco
Bloco <|-- CarrosselBloco
Bloco <|-- TopicosBloco
CarrosselBloco o-- Imagem : cada foto com a sua legenda
classDiagram
direction TB
class Cliente
class NoticiaDirector {
-builder: NoticiaBuilder
+NoticiaDirector(builder: NoticiaBuilder)
+setBuilder(builder: NoticiaBuilder) void
+construirPersonalizada(titulo: String, subtitulo: String, categoria: String, capa: Imagem, autor: Autor, roteiro: List~ItemRoteiro~, fonte: String) void
+construirNoticiaPadrao(titulo: String, categoria: String, capa: Imagem, autor: Autor, texto: String) void
-validar(roteiro: List~ItemRoteiro~) void
}
class ItemRoteiro {
+tipo: TipoBloco
+conteudo: Object
}
class TipoBloco {
<<enumeration>>
TEXTO
IMAGEM
CARROSSEL
TOPICOS
}
class NoticiaBuilder {
<<interface>>
+reset() void
+definirCabecalho(titulo: String, categoria: String, capa: Imagem) void
+definirSubtitulo(subtitulo: String) void
+definirAutor(autor: Autor) void
+adicionarTexto(texto: String) void
+adicionarImagem(img: Imagem) void
+adicionarCarrossel(imgs: List~Imagem~) void
+adicionarTopicos(itens: List~String~) void
+definirRodape(fonte: String) void
+getResultado() Noticia
}
class NoticiaDestaqueBuilder {
-noticia: Noticia
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class NoticiaCompactaBuilder {
-noticia: Noticia
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class NoticiaMistaBuilder {
-noticia: Noticia
-posicaoTitulo: PosicaoTitulo
+NoticiaMistaBuilder(posicaoTitulo: PosicaoTitulo)
+definirCabecalho(titulo, categoria, capa) void
+definirSubtitulo(subtitulo) void
+definirAutor(autor) void
+adicionarImagem(img) void
+adicionarCarrossel(imgs) void
+getResultado() Noticia
}
class PosicaoTitulo {
<<enumeration>>
SUPERIOR_ESQUERDA
SUPERIOR_DIREITA
INFERIOR_ESQUERDA
INFERIOR_DIREITA
CENTRO
}
class Noticia {
-titulo: String
-subtitulo: String
-categoria: String
-capa: ImagemBloco
-posicaoTitulo: PosicaoTitulo
-autor: Autor
-dataCriacao: Date
-blocos: List~Bloco~
-rodape: String
+Noticia()
+adicionar(b: Bloco) void
+getDataCriacao() Date
+renderizar() String
}
class Autor {
-nome: String
-foto: String
+getNome() String
+getFoto() String
}
note for Noticia "dataCriacao é gerada automaticamente\nno construtor (new Date()): nem o\nCliente nem o Builder informam a data"
note for NoticiaMistaBuilder "título e subtítulo ficam sobre a capa,\nna posição recebida no construtor"
class Bloco {
<<abstract>>
+renderizar() String
}
class TextoBloco
class ImagemBloco {
-url: String
-legenda: String
-largura: int
}
class CarrosselBloco {
-imagens: List~Imagem~
-modo: String
}
class Imagem {
+url: String
+legenda: String
}
class TopicosBloco
Cliente --> NoticiaDirector : usa
Cliente ..> NoticiaDestaqueBuilder : escolhe um
Cliente ..> NoticiaCompactaBuilder : escolhe um
Cliente ..> NoticiaMistaBuilder : escolhe um e a posição
Cliente ..> ItemRoteiro : monta o roteiro
Cliente ..> Autor : informa o autor
NoticiaDirector o--> NoticiaBuilder : builder
NoticiaDirector ..> ItemRoteiro : lê e valida
ItemRoteiro --> TipoBloco
NoticiaBuilder <|.. NoticiaDestaqueBuilder
NoticiaBuilder <|.. NoticiaCompactaBuilder
NoticiaBuilder <|.. NoticiaMistaBuilder
NoticiaDestaqueBuilder --> Noticia : constrói
NoticiaCompactaBuilder --> Noticia : constrói
NoticiaMistaBuilder --> Noticia : constrói
NoticiaMistaBuilder --> PosicaoTitulo
Noticia *-- Bloco
Noticia --> Autor : escrita por
Noticia --> PosicaoTitulo
Bloco <|-- TextoBloco
Bloco <|-- ImagemBloco
Bloco <|-- CarrosselBloco
Bloco <|-- TopicosBloco
CarrosselBloco o-- Imagem : cada foto com a sua legenda
Figura: Diagrama de classes do Builder de notícias com Director (Fonte: João Cruz, 2026)