Camada de lógica de negócio

A camada de lógica de negócio da aplicação deve conter a concretização das entidades do domínio da aplicação. Neste exemplo, o domínio é muito simples. A aplicação a desenvolver tem que manter o conjunto de números inteiros inseridos pelo utilizador, preservando a ordem de inserção dos números. Assim, é suficiente ter apenas uma classe, designada como IntegerManager,  na camada de lógica de negócio com as seguintes funcionalidades:
  1. Guardar uma série de números inteiros não repetidos;
  2. Permitir adicionar e remover um número à série;
  3. Devolver a série de números com a mesma ordem com que foram inseridos.
Tal como dito anteriormente, a lógica de negócio da aplicação deve estar concretizada na camada de lógica de negócio. A camada de serviços não deve concretizar lógica de negócio para evitar possível duplicação de código e ter uma melhor qualidade no desenho da aplicação. Por exemplo, a regra de negócio que a série de inteiros só tem números distintos deve estar concretizada no método da classe IntegerManager que adiciona um número à série e não no comando que é executado quando o utilizador escolhe a opção de adicionar um número. Isto permite localizar a verificação de uma regra de negócio num único sítio (numa determinada classe do domínio) em vez de ter a verificação da regra duplicada em vários comandos onde a regra possa ser violada. 

A classe IntegerManger deve ser concretizada no package ex.core, em que ex representa o nome da aplicação e core representa a camada de lógica de negócio. Esta classe precisa de guardar a série de números inseridos pelo utilizador.  Para guardar esta série podemos utilizar uma colecção do tipo Set ou do tipo List. Tendo em conta que é necessário preservar a ordem de inserção, então devemos escolher o tipo List. 

Note-se que as entidades da camada de lógica de negócio não devem referir-se a entidades relacionadas com a interacção com o utilizador por forma a serem completamente independentes da interacção com o utilizador, permitindo assim que se possa alterar completamente a camada de serviços ou de apresentação sem ter qualquer impacto na concretização da camada de lógica de negócio.

De seguida apresenta-se a concretização desta classe. 
package ex.core;

/**
 * This class is the single core entity of this small example. It holds a list of unique int numbers.
 **/

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

public class IntegerManager {
    private List<Integer> _numbers;

    public IntegerManager() {
        _numbers = new ArrayList<>();
    }

    public boolean addNumber(Integer n) {
        if (_numbers.contains(n))
          return false;

        _numbers.add(n);
        return true;
    }

    public List<Integer> getNumbers() {
        return Collections.unmodifiableList(_numbers);
    }
}