Criar um gerenciador de vendas

Estou começando a aprender OO agora e estou habituado a programar de forma estruturada e estou tendo dificuldades em criar uma classe que vá registrando as vendas a medida que vá acontecendo. São as seguintes tarefas que deve fazer:

a) Implemente as classes em Java e seus relacionamentos.
b) Implemente uma classe Loja que cria objetos do tipo Cliente, Produto e Venda e exibe na tela o cliente
que está realizando uma compra, os produtos comprados e o valor total da venda.
c) Nomeie os relacionamentos entre as classes.
d) Adicione uma classe Caixa à sua modelagem de classes. Um caixa contém uma coleção de vendas.
Apenas uma venda é a venda atualmente aberta no caixa. A classe Caixa deve possuir operações para
incluir um novo produto na venda atualmente aberta.
e) Adicione um construtor sobrecarregado à classe Venda de modo que se possa criar uma venda
passando-se para ela um arranjo de produtos ou a quantidade máxima de produtos da venda.

Observações:
1 – Alguns gets e sets foram sugeridos no diagrama de classes, mas caso precisem/desejem pode incluir
outros métodos de acesso.
2 – Lembre-se de implementar, onde for necessário, arrays como estruturas. Coleções não serão aceitas
nesse exercício.
3 – Será preciso aumentar o tamanho dos arrays dinamicamente, ou seja, a cada adição de produto ou
venda, já que não foi definido a priori o tamanho desses arrays (propositalmente).

identar texto pré-formatado por 4 espaços[Exercícios Propostos.pdf|attachment](upload://wudHKJK4tfU3XUELqmFuZdwPHmG.pdf) (358,1,KB) 

Já tenho as seguintes classes prontas:

/**

  • Classe Cliente
  • @version v 1.0 outubro/2020
  • @author MELO, Ewerton
    */

public class Cliente {
private String nome;
private String endereco;

public Cliente(String nome, String endereco) {
	this.nome = nome;
	this.endereco = endereco;
}

public Cliente(String nome) {
	this.nome = nome;		
}

public Cliente() {
	
}

public String getNome() {
	
	return this.nome;
	
}

public void setNome(String nome) {
	
	this.nome = nome;
}

public String getEndereco() {
	
	return this.endereco;
	
}

public void setEndereco(String endereco) {
	
	this.endereco = endereco;
}

public String imprimeCliente() {		
	return "Cliente: " + this.nome + "\n Endereco: " + this.endereco;
}

}

public class Produto {

private String descricao;						       
private double preco;
private int total;

	
public Produto(String descricao, double preco) {		
	this.descricao = descricao;
	this.preco = preco;		
}

public Produto() {
	
}

public double getTotal() {		
	return total++;		
}

public String getDescricao() {
	return descricao;
}

public double getPreco() {		
	return preco;		
}
	
public String imprimeProduto(String descricao, double total) {
	return "Produto: "  + this.descricao + " Total:" + this.total;
}

}

import java.util.*;

public class Venda {
int i;
int numProdutos;
double total;
Date data = new Date();
private Cliente[] cliente;
private Produto[] produto;

public Venda() {

}
        
public Venda(Date data, Cliente[] cliente, Produto[] produto) {		
	this.data = data;
	this.cliente = cliente;
	this.produto = produto;		
}

public double getTotal() {
	return this.total;	
}

public void adicioneProduto(Produto[] p) {
	produto = p;
	numProdutos++;
}

public Produto getProduto(int i) {
	return this.getProduto(i);
}

public int getNumProdutos() {
    return this.numProdutos;
}

public String imprimeVenda() {
	return data + " " + cliente + " " + produto; 
}		

}

Preciso de esclarecimentos, por favor coloquem exemplos para facilitar minha compreensão.