Relações entre
objetos
Agregação, Composição e
Associação
Relações
•
Objetos não existem isolados
–
São
formados
por outros objetos
–
Objetos
usam
outros objetos
–
Um programa OO possui vários
objetos que
interagem
entre si
–
Modelagem define quais objetos
3
Relações entre objetos
•
Objetos possuem relacionamentos
–
Composição
•
Um objeto pode
ser formado
por outros
objetos
–
Casa, livro, jardim, agenda de contatos, etc
–
Agregação
•
Um objeto pode
conter
outros objetos
–
Carro (motor, pneu, porta)
–
Associação
•
Objetos podem
usar
outros objetos
Composição
•
Um livro é composto de capítulos
–
Capítulo é parte essencial de livro
•
Se não existir capítulo, não existe livro
•
Capítulo não existe fora de livro
•
Linha com losângulo preenchido na classe
“dominante”
–
Livro é composto de 1 ou mais capítulos
Losângulo pode
ser suprimido
5
Composição
public
class
Livro {
private
Capitulo[]
capitulos
;
public
Livro(
int
qtdCapitulo){
capitulos
=
new
Capitulo[qtdCapitulo];
}
}
public
class
Capitulo {
private
Livro
livro
;
/* Definição da classe Capítulo */
}
Referência pode ou não
ser bidirecional. Capitulo
não precisa ter o atributo
livro
Os atributos são derivados dos
relacionamentos. Não existem
no diagrama
Agregação
•
Carro possui Pneu, Motor e Porta
–
Não são partes essenciais do carro
•
Retirando as portas um carro continua sendo um
carro
•
Pneus/portas existem como objetos independentes
•
Linha com losângulo vazio na classe
“dominante”
Losângulo também
pode ser suprimido
7
Agregação
public
class
Carro {
private
Motor
motor
;
private
Porta
portas
[];
private
Pneu
pneus
[];
/* ... */
}
public
class
Motor {
/* ... */
}
public
class
Porta {
/* ... */
}
public
class
Pneu {
/* ... */
}
public
class
Carro {
private
Motor
motor
;
private
Porta
portas
[];
private
Pneu
p1, p2, p3, p4
;
/* ... */
}
Pode ser implementado
de mais de uma forma
Associação
•
Objetos que usam outros objetos
–
Podem ser implementados como
aributos
public
class
Trem {
private
EstradaDeFerro
estradaDeFerro
;
/* ... */
public
void
definirEstrada(EstradaDeFerro estradaDeFerro){
this
.
estradaDeFerro
= estradaDeFerro;
}
9
Observações
•
Composição, Agregação e Associação
–
Mesma forma de implementar
–
Muda apenas o
conceito
•
Comportamento diferente
–
Muito comum usar apenas notação da
associação
•
Sem o losângulo
•
Composições e Agregações são “tipos” de
associações
–
Representam relacionamento
“tem um”
•
Carro “tem uma” roda
•
Livro “tem um” capitulo
Multiplicidade
•
Indica quantidade de objetos
referenciados
–
Principais:
•
A
possui
exatamente
1
B
•
A
possui
vários
B
•
A
possui
1 ou mais
B
•
A
possui
0 ou 1
B
11
Nomes
•
Pode-se especificar o nome do
atributo
–
Obrigar existência do atributo
–
Carro tem um atributo privado
motor
do tipo
Motor
public
class
Carro {
private
Motor
motor
;
/* ... */
}
Nomes
•
Coleções
–
Atributos com multiplicidade
*
podem ser
implementados de mais de uma forma
•
Array é uma delas
public
class
Livro {
private
Capitulo
cap
[];
}
Livros tem vários capítulos.
13
Exemplo
•
Modelo de objetos de uma agenda
Observações
•
Responsabilidades
–
Classes de domínio
não
devem
interagir com o usuário
•
System.out.println
,
Scanner
, etc
•
Elas podem ser usadas em várias
interfaces com usuário diferentes
–
Texto, WEB, GUI, Hand-held, Celurares, etc
•
Defina uma classe que represente a
interface com usuário (UI – User
15
Contato
package
br.cefetrn.tads.poo;
public
class
Contato {
private
String
nome
;
private
String
telefone
;
public
String getNome() {
return
nome
;
}
public
void
setNome(String nome) {
this
.
nome
= nome;
}
public
String getTelefone() {
return
telefone
;
}
public
void
setTelefone(String telefone) {
this
.
telefone
= telefone;
}
}
Pacote
Atributos
Agenda (1)
package
br.cefetrn.tads.poo;
public
class
Agenda {
// Array para armazenar os contatos
private
Contato
contatos
[];
// Atributo usado para armazenar a
// quantidade de contatos na agenda
private
int
quantidade
;
public
Agenda(){
// Agenda tem capacidade para 10 contatos
contatos
=
new
Contato[10];
//Criada sem contato algum
quantidade
= 0;
}
public
void
inserir(Contato contato){
contatos
[
quantidade
++] = contato;
}
17
Agenda (2)
public
Contato buscar(String nome){
for
(
int
i = 0 ; i <
quantidade
; i++)
if
(
contatos
[i].getNome().equals(nome))
return
contatos
[i];
// Se sair do laço é porque não encontrou
// nenhum contato com o nome passado
return
null
;
}
public
void
remover(String nome){
//Exercício
}
public
int
quantidade(){
return
quantidade
;
}
UI (1)
package br.cefetrn.tads.poo;
import java.util.Scanner;
public class AgendaUI {
private Agenda agenda;
private Scanner sc;
public UI() {
agenda = new Agenda(); }
public void run() {
sc = new Scanner(System.in);
int opcao = 0;
do {
printMenu();
opcao = Integer.parseInt(sc.nextLine());
switch (opcao) { case 1: inserirContato(); break; case 2: buscarContato(); break; case 3: removerContato(); break; } } while (opcao != 0); }
19
UI (2)
private void inserirContato() {
System.out.print("Digite o nome: "); String nome = sc.nextLine();
System.out.println("Digite o telefone"); String telefone = sc.nextLine();
Contato novo = new Contato(); novo.setNome(nome);
novo.setTelefone(telefone);
agenda.inserir(novo); }
private void buscarContato() {
System.out.print("Digite o nome: "); String nome = sc.nextLine();
Contato contato = agenda.buscar(nome);
if (contato != null)
System.out.println(contato);
else
System.out.println("Contato não encontrado!!!!"); }
private void removerContato() {
System.out.println("A ser implementado"); }
UI (3)
private void printMenu() {
System.out.println("\n\n ---- Menu Agenda de contatos V 1.0 ----");
System.out.println("\n Memória: " + agenda.quantidade() + " contatos"); System.out.println(" 0 - Sair");
System.out.println(" 1 - Inserir Contato"); System.out.println(" 2 - Buscar Contato"); System.out.println(" 3 - Remover Contato"); System.out.print("\n Digite uma opçãoo: "); }
}