Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

Uma mailing list mantém o controle de quem está inscrito na lista de discussão e fornece um único ponto de acesso através do qual qualquer pessoa inscrita nessa lista possa se comunicar com todos os participantes da mesma. Desenvolva um simulador de mailing list utilizando o padrão de projeto Mediator, de modo que os usuários possam se cadastrar ou se retirar da lista, além de poderem enviar mensagens para todos os usuários cadastrados na mesma.

 

Diagrama de Classes na Linguagem de Programação Java MailingList.java MyMailingList.java User.java Application.java
Diagrama de Classes
Diagrama de Classes na Linguagem de Programação Java

Arquivo MailingList.java

/*************************************************************************
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)  *
 *                  Ybadoo - Solucoes em Software Livre (ybadoo.com.br)  *
 *                                                                       *
 * Permission is granted to copy, distribute and/or modify this document *
 * under the terms of the GNU Free Documentation License, Version 1.3 or *
 * any later version published by the  Free Software Foundation; with no *
 * Invariant Sections,  no Front-Cover Texts, and no Back-Cover Texts. A *
 * A copy of the  license is included in  the section entitled "GNU Free *
 * Documentation License".                                               *
 *                                                                       *
 * Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic)                             *
 * OpenJDK Version "1.8.0_121"                                           *
 * OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)               *
 *************************************************************************/

package com.ybadoo.tutoriais.poo.tutorial10.exercicio36;

/**
 * Definição da lista de discussão
 *
 * Mediator - define uma interface para comunicação com objetos de classe
 *            Colleague (Gamma, 2000).
 */
public interface MailingList
{
  /**
   * Adicionar o usuário a lista de discussão
   *
   * @param user usuário
   */
  public void add(User user);
  
  /**
   * Remover o usuário da lista de discussão
   *
   * @param user usuário
   */
  public void remove(User user);
  
  /**
   * Enviar uma mensagem a lista de discussão
   *
   * @param user usuário
   * @param message mensagem
   */
  public void send(User user, String message);
}

Arquivo MyMailingList.java

/*************************************************************************
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)  *
 *                  Ybadoo - Solucoes em Software Livre (ybadoo.com.br)  *
 *                                                                       *
 * Permission is granted to copy, distribute and/or modify this document *
 * under the terms of the GNU Free Documentation License, Version 1.3 or *
 * any later version published by the  Free Software Foundation; with no *
 * Invariant Sections,  no Front-Cover Texts, and no Back-Cover Texts. A *
 * A copy of the  license is included in  the section entitled "GNU Free *
 * Documentation License".                                               *
 *                                                                       *
 * Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic)                             *
 * OpenJDK Version "1.8.0_121"                                           *
 * OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)               *
 *************************************************************************/

package com.ybadoo.tutoriais.poo.tutorial10.exercicio36;

import java.util.ArrayList;
import java.util.List;

public class MyMailingList implements MailingList
{
  /**
   * Lista dos usuários cadastrados na lista de discussão
   * 
   * ConcreteMediator - implementa comportamento cooperativo através da
   *                    coordenação de objetos de classe Colleague,
   *                    conhecendo e mantendo seus colegas (Gamma, 2000)
   */
  private List<User> list;
  
  /**
   * Inicializar a lista de discussão
   */
  public MyMailingList()
  {
    list = new ArrayList<>();
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.tutorial10.exercicio36.MailingList
   *      #add(com.ybadoo.tutoriais.poo.tutorial10.exercicio36.User)
   */
  @Override
  public void add(User user)
  {
    list.add(user);

    System.out.print("Usuário ");
    System.out.print(user.getName());
    System.out.println(" cadastrado na lista de discussão.");
    System.out.println();
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.tutorial10.exercicio36.MailingList
   *      #remove(com.ybadoo.tutoriais.poo.tutorial10.exercicio36.User)
   */
  @Override
  public void remove(User user)
  {
    list.remove(user);

    System.out.print("Usuário ");
    System.out.print(user.getName());
    System.out.println(" removido da lista de discussão.");
    System.out.println();
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.tutorial10.exercicio36.MailingList
   *      #send(com.ybadoo.tutoriais.poo.tutorial10.exercicio36.User,
   *            java.lang.String)
   */
  @Override
  public void send(User user, String message)
  {
    System.out.println("MENSAGEM ENVIADA");
    System.out.println("Remetente: " + user.getName());
    System.out.println("Destinatário: lista de discussão");
    System.out.println("Mensagem: " + message);
    System.out.println();
    
    for (User userList : list)
    {
      if (userList != user)
      {
        userList.receive(user, message);
      }
    }
  }
}

Arquivo User.java

/*************************************************************************
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)  *
 *                  Ybadoo - Solucoes em Software Livre (ybadoo.com.br)  *
 *                                                                       *
 * Permission is granted to copy, distribute and/or modify this document *
 * under the terms of the GNU Free Documentation License, Version 1.3 or *
 * any later version published by the  Free Software Foundation; with no *
 * Invariant Sections,  no Front-Cover Texts, and no Back-Cover Texts. A *
 * A copy of the  license is included in  the section entitled "GNU Free *
 * Documentation License".                                               *
 *                                                                       *
 * Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic)                             *
 * OpenJDK Version "1.8.0_121"                                           *
 * OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)               *
 *************************************************************************/

package com.ybadoo.tutoriais.poo.tutorial10.exercicio36;

/**
 * Representação do usuário na lista de discussão
 *
 * Colleague - cada classe Colleague conhece seu objeto Mediator de outra
 *             forma, e se comunica com o seu mediador sempre que, de outra
 *             forma, teria se comunicado com outro colega (Gamma, 2000).
 */
public class User
{
  /**
   * Lista de discussão
   */
  private MailingList mailingList;

  /**
   * Nome do usuário
   */
  private String name;

  /**
   * Inicializar o usuário
   *
   * @param name nome do usuário
   * @param mailingList lista de discussão
   */
  public User(String name, MailingList mailingList)
  {
    this.name = name;

    this.mailingList = mailingList;

    this.mailingList.add(this);
  }

  /**
   * Retornar o nome do usuário
   *
   * @return nome do usuário
   */
  public String getName()
  {
    return name;
  }
  
  /**
   * Receber uma mensagem da lista de discussão
   *
   * @param user usuário que enviou a mensagem
   * @param message mensagem enviada
   */
  public void receive(User user, String message)
  {
    System.out.println("MENSAGEM RECEBIDA");
    System.out.println("Remetente: " + user.getName());
    System.out.println("Destinatário: " + name);
    System.out.println("Mensagem: " + message);
    System.out.println();
  }

  /**
   * Remover o usuário da lista de discussão
   */
  public void remove()
  {
    mailingList.remove(this);
  }
  
  /**
   * Enviar uma mensagem a lista de discussão
   *
   * @param message mensagem
   */
  public void send(String message)
  {
    mailingList.send(this, message);
  }
}

Arquivo Application.java

/*************************************************************************
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)  *
 *                  Ybadoo - Solucoes em Software Livre (ybadoo.com.br)  *
 *                                                                       *
 * Permission is granted to copy, distribute and/or modify this document *
 * under the terms of the GNU Free Documentation License, Version 1.3 or *
 * any later version published by the  Free Software Foundation; with no *
 * Invariant Sections,  no Front-Cover Texts, and no Back-Cover Texts. A *
 * A copy of the  license is included in  the section entitled "GNU Free *
 * Documentation License".                                               *
 *                                                                       *
 * Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic)                             *
 * OpenJDK Version "1.8.0_121"                                           *
 * OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)               *
 *************************************************************************/

package com.ybadoo.tutoriais.poo.tutorial10.exercicio36;

/**
 * Classe responsável pela execução do padrão Mediator
 */
public class Application
{
  /**
   * Construtor para inicializar a execução do padrão Mediator
   */
  private Application()
  {

  }

  /**
   * Método principal da linguagem de programação Java
   *
   * @param args argumentos da linha de comando (não utilizado)
   */
  public static void main(String[] args)
  {
    MailingList mailingList = new MyMailingList();
    
    User fulano = new User("Fulano", mailingList);
    User beltrano = new User("Beltrano", mailingList);
    User ciclano = new User("Ciclano", mailingList);
    
    fulano.send("Olá!");
    beltrano.send("OK!");
    ciclano.send("Bye!");
    ciclano.remove();
  }
}
Gamma, Erich. (2000). Padrões de Projeto: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman. 364 páginas.