Não isso não é caché, todos os objetos colaboram entre si, bom vou tentar elecuidar um pouco o exemplo colocando um sistema que estou recentemente estudando. É um sistema aparentemente simples de reservar sala. segue o código, por favor acredito que deve existir algumas falhas de OO mas foi a maneira mais coerente que consegui fazer, por tanto sugestões são bem vindas. Este é o código servidor que será acessado via Web service através de seus façades. Segue
Esta classes é responsável por controlar todas as salas e a superalocação de equipamentos.
public class ReservaSalas {
// Atributos privados
private Set<Sala> salas;
// Construtor
public ReservaSalas() {
salas = RepositorioSalas.getInstancia().listarTodas();
}
// Métodos públicos
public Reserva criarReserva(Usuario usuario, Sala sala, Date dataHora, String motivo, Set<Equipamento> equipamentos) throws ReservaException {
Reserva reserva = null;
if (validarEquipamentos(dataHora, equipamentos)) {
reserva = new Reserva();
reserva.criarReserva(usuario, sala, dataHora, motivo, equipamentos);
}
return reserva;
}
public Reserva alterarReserva(Usuario usuario, Sala sala, Date dataHora, String motivo, Set<Equipamento> equipamentos) {
Reserva reserva = null;
if (validarEquipamentos(dataHora, equipamentos)) {
reserva = sala.consultaReservaPorDataHora(dataHora);
reserva.alterarReserva(usuario, motivo, equipamentos);
}
return reserva;
}
public void liberarReserva(Sala sala, Date dataHora) {
Reserva reserva = sala.consultaReservaPorDataHora(dataHora);
reserva.liberarReserva();
}
public Set<Sala> getSalas() {
Set<Sala> copia = new HashSet<Sala>();
for (Sala s: salas){
copia.add(s);
}
return copia;
}
public int countSalas() {
return salas.size();
}
public boolean validarEquipamentos(Date dataHora, Set<Equipamento> equipamentos) {
for (Sala s : salas) {
Reserva reserva = s.consultaReservaPorDataHora(dataHora);
if (reserva.countEquipamentos() != 0) {
for (Equipamento e : equipamentos) {
if (reserva.contemEquipamento(e)) {
return false;
}
}
}
}
return true;
}
}
A Sala é responsável por registrar uma reserva e efetuar consultas.
public class Sala {
//Constantes privadas
private static final String nomeSalaIdNulo = "O nome ou o id não podem ser nulo.";
//Atributos privados
private String salaId;
private String nome;
private Set<Reserva> reservas;
//Construtor
public Sala(String salaId, String nome){
if ( nome == null || salaId == null ) {
throw new SalaRuntimeException(nomeSalaIdNulo);
}
this.nome = nome;
this.salaId = salaId;
reservas = new HashSet<Reserva>();
}
//Métodos públicos
public boolean registrarReserva(Reserva reserva){
return reservas.add(reserva);
}
public boolean removerReserva(Reserva reserva){
return reservas.remove(reserva);
}
public String getNome(){
return nome;
}
public String getSalaId(){
return salaId;
}
public Reserva consultaReservaPorDataHora(Date dataHora){
for (Reserva r: reservas){
if (r.getDataHora().equals(dataHora) ){
return r;
}
}
return null;
}
public Set<Reserva> consultarReservaPorPeriodo(Date dataInicial, Date dataFinal){
Set<Reserva> result = new HashSet<Reserva>();
for (Reserva r: reservas){
if (r.getDataHora().after(dataInicial) && r.getDataHora().before(dataFinal) ){
result.add(r);
}
}
return result;
}
public Set<Reserva> consultarReservaPorDataHoraEquipamento(Date dataHora, Equipamento equipamento){
Set<Reserva> result = new HashSet<Reserva>();
for (Reserva r: reservas){
if (r.getDataHora().equals(dataHora) && r.contemEquipamento(equipamento) ){
result.add(r);
}
}
return result;
}
public int countReservas(){
return reservas.size();
}
}
Esta é a reserva uma reserva tem data hora, motivo da reserva, quem está reservando, a qual sala ela pertence, e quais equipamentos serão utilizados. Fora isso ela faz verificações se os equipamentos podem ser alocados dependendo do perfil do usuário.
public class Reserva {
// Contantes privadas
private static final String equipamentoNulo = "O equipamento não pode ser nulo.";
private static final String dataHoraInvalida = "Data ou hora inválido(s).";
private static final String usuarioNulo = "O Usuário não pode ser nulo.";
private static final String usuarioInvalido = "O Usuário inválido.";
// Atributos privados
private Sala sala;
private Usuario usuario;
private Date dataHora;
private String motivo;
private Set<Equipamento> equipamentos;
// Construtor
public Reserva() {
sala = null;
usuario = null;
dataHora = null;
motivo = null;
equipamentos = new HashSet<Equipamento>();
}
// Métodos Públicos
public void criarReserva(Usuario usuario, Sala sala, Date dataHora, String motivo, Set<Equipamento> equipamentos) throws ReservaException {
if (this.sala == null) {
setUsuario(usuario);
setSala(sala);
setDataHora(dataHora);
setMotivo(motivo);
setEquipamentos(equipamentos);
sala.registrarReserva(this);
}
}
public void alterarReserva(Usuario usuario, String motivo, Set<Equipamento> equipamentos) {
if (this.sala != null) {
setUsuario(usuario);
setMotivo(motivo);
setEquipamentos(equipamentos);
}
}
public void liberarReserva() {
if (this.sala != null) {
sala.removerReserva(this);
}
}
public Date getDataHora() {
return dataHora;
}
public String getMotivo() {
return motivo;
}
public int countEquipamentos() {
return equipamentos.size();
}
public Set<Equipamento> getEquipamentos() {
HashSet<Equipamento> equipamentos = new HashSet<Equipamento>();
for (Equipamento e : this.equipamentos)
equipamentos.add(e);
return equipamentos;
}
public boolean contemEquipamento(Equipamento equipamento) {
if (equipamento == null) {
throw new ReservaRuntimeException(equipamentoNulo);
}
if (countEquipamentos() == 0) {
return false;
}
return equipamentos.contains(equipamento);
}
// Métodos privados
private void setDataHora(Date dataHora) throws ReservaException {
boolean horaValida = validarHora(dataHora);
boolean dataValida = validarData(dataHora);
if (horaValida == true && dataValida == true) {
this.dataHora = dataHora;
return;
}
throw new ReservaException(dataHoraInvalida);
}
private boolean validarHora(Date hora) {
String sHora = Calendario.getCalendario().formatarHora(hora);
for (String horarios : Calendario.HORARIOS) {
if (horarios.equals(sHora)) {
return true;
}
}
return false;
}
private boolean validarData(Date data) {
return Calendario.getCalendario().dataDentroSemana(data);
}
private void setSala(Sala sala) {
this.sala = sala;
}
private void setUsuario(Usuario usuario) {
if (usuario == null) {
throw new ReservaRuntimeException(usuarioNulo);
}
if (!usuario.isValid()) {
throw new ReservaRuntimeException(usuarioInvalido);
}
if (this.usuario.equals(usuario)) {
return;
}
this.usuario = usuario;
}
private void setEquipamentos(Set<Equipamento> equipamentos) {
if (equipamentos == null) {
this.equipamentos.clear();
return;
}
if (equipamentos.equals(this.equipamentos)) {
return;
}
if (usuario.getPerfil().validarEquipamentos(equipamentos)) {
this.equipamentos = equipamentos;
}
}
private void setMotivo(String motivo) {
this.motivo = motivo;
}
}
public class Usuario {
//Constantes privadas
private static final String nomeNulo = "O nome não pode ser nulo.";
private static final String emailNulo = "O email não pode ser nulo.";
//Atributos privados
private String usuarioToken;
private String nome;
private String email;
private String senha;
private Perfil perfil;
//Construtor
public Usuario() {
usuarioToken = null;
nome = null;
email = null;
senha = null;
perfil = null;
}
//Métodos públicos
public boolean validar(String email, String senha) {
return false;
}
private void setUsuarioToken(String token){
this.usuarioToken = token;
}
public void setNome(String nome) {
if (nome == null){
throw new IllegalArgumentException(nomeNulo);
}
this.nome = nome;
}
public void setEmail(String email) {
if (email == null){
throw new IllegalArgumentException(emailNulo);
}
this.email = email;
}
public void setSenha(String senha) {
this.senha = senha;
}
public void setPerfil(Perfil perfil) {
this.perfil = perfil;
}
public String getEmail() {
return email;
}
public String getNome() {
return nome;
}
public Perfil getPerfil() {
return perfil;
}
public String getSenha() {
return senha;
}
public boolean isValid() {
if (nome == null || email == null || senha == null || perfil == null){
return false;
}
if (nome.length() == 0 || email.length() == 0 || senha.length() == 0 || perfil.countEquipamentos() == 0){
return false;
}
return true;
}
}
public class Perfil {
// Constantes privadas
private static final String equipamentoNulo = "O(s) equipamento(s) não pode(m) ser nulo(s).";
// Atributos privados
private String nome;
private Set<Equipamento> equipamentos;
// Construtores
public Perfil(String nome, Equipamento equipamento) {
if (equipamento == null) {
throw new IllegalArgumentException(equipamentoNulo);
}
setNome(nome);
this.equipamentos = new HashSet<Equipamento>();
equipamentos.add(equipamento);
}
public Perfil(String nome, Set<Equipamento> equipamentos) {
setNome(nome);
this.equipamentos = new HashSet<Equipamento>();
setEquipamentos(equipamentos);
}
// Métodos públicos
public int countEquipamentos() {
return equipamentos.size();
}
public Set<Equipamento> getEquipamentos() {
return equipamentos;
}
public String getNome() {
return nome;
}
public boolean validarEquipamentos(Set<Equipamento> equipamentos) {
boolean equipamentoInvalido = false;
if (nome.length() > 0 && equipamentos.size() > 0) {
for (Equipamento e1 : equipamentos) {
for (Equipamento e2 : this.equipamentos) {
if (e1.equals(e2)) {
equipamentoInvalido = false;
break;
}
equipamentoInvalido = true;
}
}
}
return equipamentoInvalido;
}
// Métodos privados
private void setEquipamentos(Set<Equipamento> equipamentos) {
if (equipamentos == null) {
throw new IllegalArgumentException(equipamentoNulo);
}
this.equipamentos = equipamentos;
}
private void setNome(String nome) {
this.nome = nome;
}
}
Bom chega.