Duvida no Padrao Expert!

[b]Estou Com Duvida No código abaixo, onde o padrão Expert está sendo furado?
Melhore o programa, aplicando o padrão Expert

[code]public class Fita {
public enum Tipo {
normal, lancamento, infantil
};
private String título;
private Tipo códigoDePreço;

public Fita(String título, Tipo códigoDePreço) {
    this.título = título;
    this.códigoDePreço = códigoDePreço;
}

public String getTítulo() {
    return título;
}

public Tipo getCódigoDePreço() {
    return códigoDePreço;
}

public void setCódigoDePreço(Tipo códigoDePreço) {
    this.códigoDePreço = códigoDePreço;
}

}

public class Aluguel {
private Fita fita;
private int diasAlugada;

public Aluguel(Fita fita, int diasAlugada) {
    this.fita = fita;
    this.diasAlugada = diasAlugada;
}

public Fita getFita() {
    return fita;
}

public int getDiasAlugada() {
    return diasAlugada;
}

}

import java.util.ArrayList;
import java.util.Collection;

public class Cliente {
private String nome;

private Collection<Aluguel> fitasAlugadas = new ArrayList<Aluguel>();

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

public String getNome() {
    return nome;
}

public void adicionaAluguel(Aluguel aluguel) {
    fitasAlugadas.add(aluguel);
}

public String extrato() {
    final String fimDeLinha = System.getProperty("line.separator");
    double valorTotal = 0.0;
    int pontosDeAlugadorFrequente = 0;
    String resultado = "Registro de Alugueis de " + getNome() + fimDeLinha;

    for (Aluguel f : fitasAlugadas) {

        double valorCorrente = 0.0;
        Aluguel cada = f;

        // determina valores para cada linha
        // switch com enum
        switch (cada.getFita().getCódigoDePreço()) {
        case normal:
            valorCorrente += 2;
            if (cada.getDiasAlugada() > 2) {
                valorCorrente += (cada.getDiasAlugada() - 2) * 1.5;
            }
            break;
        case lancamento:
            valorCorrente += cada.getDiasAlugada() * 3;
            break;
        case infantil:
            valorCorrente += 1.5;
            if (cada.getDiasAlugada() > 3) {
                valorCorrente += (cada.getDiasAlugada() - 3) * 1.5;
            }
            break;
        } // switch
        // trata de pontos de alugador frequente
        pontosDeAlugadorFrequente++;
        // adiciona bonus para aluguel de um lançamento por pelo menos 2
        // dias
        if (cada.getFita().getCódigoDePreço() == Fita.Tipo.lancamento
            && cada.getDiasAlugada() > 1) {
            pontosDeAlugadorFrequente++;
        }

        // mostra valores para este aluguel
        resultado += "\t" + cada.getFita().getTítulo() + "\t"
                     + valorCorrente + fimDeLinha;
        valorTotal += valorCorrente;
    } // while
    // adiciona rodapé
    resultado += "Valor total devido: " + valorTotal + fimDeLinha;
    resultado += "Voce acumulou " + pontosDeAlugadorFrequente
                 + " pontos de alugador frequente";
    return resultado;
}

}
[/code]