Pular para conteúdo

Builder de notícias com Director

← Voltar

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)