Pular para conteúdo

Builder de notícias com Director

classDiagram
direction TB
    class Cliente {
    }

    class NoticiaDirector {
        -builder: NoticiaBuilder
        +NoticiaDirector()
        +setBuilder() void
        +construirPersonalizada() void
        +construirNoticiaPadrao() void
        -validar() void
    }

    class NoticiaBuilder {
        +reset() void
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarTexto() void
        +adicionarImagem() void
        +adicionarCarrossel() void
        +adicionarTopicos() void
        +definirRodape() void
        +getResultado() Noticia
    }

    class NoticiaDestaqueBuilder {
        -noticia: Noticia
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class NoticiaCompactaBuilder {
        -noticia: Noticia
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class NoticiaMistaBuilder {
        -noticia: Noticia
        -posicaoTitulo: PosicaoTitulo
        +NoticiaMistaBuilder()
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarImagem() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class Noticia {
        -titulo: String
        -subtitulo: String
        -categoria: String
        -capa: ImagemBloco
        -posicaoTitulo: PosicaoTitulo
        -autor: Autor
        -dataCriacao: Date
        -blocos: List~Bloco~
        -rodape: String
        +Noticia()
        +adicionar() void
        +getDataCriacao() Date
        +renderizar() String
    }

    class Bloco {
        +renderizar() String
    }

    class TextoBloco {
    }

    class ImagemBloco {
        -url: String
        -largura: int
    }

    class CarrosselBloco {
    }

    class TopicosBloco {
    }

    <<interface>> NoticiaBuilder
    <<abstract>> Bloco

    note for Noticia "dataCriacao é gerada automaticamente
no construtor (new Date()): nem o
Cliente nem o Builder informam a data"
    note for NoticiaMistaBuilder "título e subtítulo ficam sobre a capa,
na posição recebida no construtor"
    note for Noticia "As informações do autor serão obtidas pelo servidor
    (id do user no banco por exemplo)"

    Cliente --> NoticiaDirector : usa
    Cliente ..> NoticiaDestaqueBuilder : escolhe um
    Cliente ..> NoticiaCompactaBuilder : escolhe um
    Cliente ..> NoticiaMistaBuilder : escolhe um e a posição
    NoticiaDirector o--> NoticiaBuilder : builder
    NoticiaBuilder <|.. NoticiaDestaqueBuilder
    NoticiaBuilder <|.. NoticiaCompactaBuilder
    NoticiaBuilder <|.. NoticiaMistaBuilder
    NoticiaDestaqueBuilder --> Noticia : constrói
    NoticiaCompactaBuilder --> Noticia : constrói
    NoticiaMistaBuilder --> Noticia : constrói
    Noticia *-- Bloco
    Bloco <|-- TextoBloco
    Bloco <|-- ImagemBloco
    Bloco <|-- CarrosselBloco
    Bloco <|-- TopicosBloco

Código do diagrama

classDiagram
direction TB
    class Cliente {
    }

    class NoticiaDirector {
        -builder: NoticiaBuilder
        +NoticiaDirector()
        +setBuilder() void
        +construirPersonalizada() void
        +construirNoticiaPadrao() void
        -validar() void
    }

    class NoticiaBuilder {
        +reset() void
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarTexto() void
        +adicionarImagem() void
        +adicionarCarrossel() void
        +adicionarTopicos() void
        +definirRodape() void
        +getResultado() Noticia
    }

    class NoticiaDestaqueBuilder {
        -noticia: Noticia
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class NoticiaCompactaBuilder {
        -noticia: Noticia
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class NoticiaMistaBuilder {
        -noticia: Noticia
        -posicaoTitulo: PosicaoTitulo
        +NoticiaMistaBuilder()
        +definirCabecalho() void
        +definirSubtitulo() void
        +definirAutor() void
        +adicionarImagem() void
        +adicionarCarrossel() void
        +getResultado() Noticia
    }

    class Noticia {
        -titulo: String
        -subtitulo: String
        -categoria: String
        -capa: ImagemBloco
        -posicaoTitulo: PosicaoTitulo
        -autor: Autor
        -dataCriacao: Date
        -blocos: List~Bloco~
        -rodape: String
        +Noticia()
        +adicionar() void
        +getDataCriacao() Date
        +renderizar() String
    }

    class Bloco {
        +renderizar() String
    }

    class TextoBloco {
    }

    class ImagemBloco {
        -url: String
        -largura: int
    }

    class CarrosselBloco {
    }

    class TopicosBloco {
    }

    <<interface>> NoticiaBuilder
    <<abstract>> Bloco

    note for Noticia "dataCriacao é gerada automaticamente
no construtor (new Date()): nem o
Cliente nem o Builder informam a data"
    note for NoticiaMistaBuilder "título e subtítulo ficam sobre a capa,
na posição recebida no construtor"
    note for Noticia "As informações do autor serão obtidas pelo servidor
    (id do user no banco por exemplo)"

    Cliente --> NoticiaDirector : usa
    Cliente ..> NoticiaDestaqueBuilder : escolhe um
    Cliente ..> NoticiaCompactaBuilder : escolhe um
    Cliente ..> NoticiaMistaBuilder : escolhe um e a posição
    NoticiaDirector o--> NoticiaBuilder : builder
    NoticiaBuilder <|.. NoticiaDestaqueBuilder
    NoticiaBuilder <|.. NoticiaCompactaBuilder
    NoticiaBuilder <|.. NoticiaMistaBuilder
    NoticiaDestaqueBuilder --> Noticia : constrói
    NoticiaCompactaBuilder --> Noticia : constrói
    NoticiaMistaBuilder --> Noticia : constrói
    Noticia *-- Bloco
    Bloco <|-- TextoBloco
    Bloco <|-- ImagemBloco
    Bloco <|-- CarrosselBloco
    Bloco <|-- TopicosBloco