Exercício

Dado o seguinte grafo que representa pessoas que seguem pessoas no Twitter.

Figura 1

A classe Pessoa abaixo representa uma pessoa (um nó desse grafo) e uma aresta direcionada do nó A para o nó B significa que B segue A.

Cada vez que o método twita é acionado em uma Pessoa X, o tweet passado como parâmetro deve ser entregue para todos os que seguem X.

Implemente esse mecanismo de entrega de tweets usando o pattern Observer. Se necessário, modifique a classe Pessoa e implemente novas classes e interfaces.

Escreva um código que teste alguns tweets.


In [1]:
public abstract class Pessoa {
    private String nome;
    
    public Pessoa(String nome) {
        this.nome = nome;
    }
   
    public String getNome() {
        return nome;
    }
    
    public abstract void twita(String tweet);
}

Resolução


In [ ]:

Exercício

Considere a seguinte representação em XML:

  • <PESSOA></PESSOA> - Há um elemento (tag) desse para cada pessoa, com um atributo nome contendo o nome da pessoa como o exemplo:
    <PESSOA nome="A">
    </PESSOA>
    <PESSOA nome="B">
    </PESSOA>
    
  • <SEGUIDOR/> - Há um elemento desse cada vez que uma Pessoa X segue uma Pessoa Y. Nesse exemplo o elemento <SEGUIDOR> fica subordinado à Pessoa X e tem um atributo nome indicando que a Pessoa Y é seguidor da Pessoa X. Veja a seguir o XML correspondente ao grafo da Figura 1:
    <PESSOA nome="A">
      <SEGUIDOR nome="B"/>
      <SEGUIDOR nome="C"/>
      <SEGUIDOR nome="D"/>
    </PESSOA>
    <PESSOA nome="B">
      <SEGUIDOR nome="E"/>
    </PESSOA>
    <PESSOA nome="C">
      <SEGUIDOR nome="E"/>
    </PESSOA>
    <PESSOA nome="D">
      <SEGUIDOR nome="F"/>
    </PESSOA>
    <PESSOA nome="E">
    </PESSOA>
    <PESSOA nome="F">
    </PESSOA>
    

Parte 1

Usando Pipe&Filter escreva um método que receba como parâmetro um objeto da classe Pessoa ou herdeira e a serialize.

Resolução


In [ ]:

Parte 2

Modifique o método da Parte 1 de modo que se comporte sob o pattern DAO.

Resolução


In [ ]:

Parte 3

Modifique o processo de serialização de forma que ele se comporte de forma recursiva, ou seja, dado uma Pessoa a ser serializada, ela também dispara o processo para a serialização de todos os seus assinantes, que por sua vez recursivamente também disparam a serialização de seus assinantes e assim sucessivamente.

Considere que o grafo é acíclico.

Veja como seria serializado um pedaço do grafo da Figura 1 se fosse disparada a serialização da Pessoa A:

<PESSOA nome="A">
    <SEGUIDOR nome="B"/>
    <SEGUIDOR nome="C"/>
    <SEGUIDOR nome="D"/>
</PESSOA>
<PESSOA nome="B">
    <SEGUIDOR nome="E"/>
</PESSOA>
<PESSOA nome="C">
    <SEGUIDOR nome="E"/>
</PESSOA>
<PESSOA nome="D">
    <SEGUIDOR nome="F"/>
</PESSOA>
<PESSOA nome="E">
</PESSOA>
<PESSOA nome="F">
</PESSOA>

Resolução


In [ ]:

Exercício

No exercício anterior, o nome dos elementos (tags) e atributos dos tags foi preestabelecido. Considere que você gostaria de usar anotações para configurar o modo como as classes e propriedades são mapeados para XML. Para que seja possível, por exemplo, produzir alternativas como a seguir:

<PERSON name="A">
    <FOLLOWER name="B"/>
    <FOLLOWER name="C"/>
    <FOLLOWER name="D"/>
</PERSON>

Escreva as interfaces de anotação propostas e elabore um exemplo ilustrativo.

Resolução


In [ ]:

Exercício

Escreva dois Factory Methods, o primeiro produz uma Pessoa ou herdeiro de pessoa o segundo produz uma aresta entre duas Pessoas ou herdeiros de Pessoa.

Resolução


In [ ]:

Desafio

Como você expandiria para uma fábrica abstrata? Por exemplo, pense em outra linha de produto, e.g., outro tipo de nó e conexão.