O padrão de desenho a aplicar neste caso é o Decorador. Este padrão permite adicionar novos comportamentos a instâncias de uma dada classe. Estes novos comportamentos vão ser representados pela abstracção BannkAccountDecorator (corresponde à entidade Decorator representada na estrutura do padrão de desenho). Esta classe suporta a interface IBankAccount, o que permite que a aplicação bancária trate objectos de BannkAccountDecorator como contas bancárias, e está associada a um objecto que representa uma conta bancária, permitindo assim adicionar novo/alterar o comportamento da conta bancária que está a ser decorada. O código desta entidade é o seguinte:

public class abstract BankAccountDecorator implements IBankAccount {
    private IBankAccount _decorator;

    public BankAccountDecorator(BankAccountDecorator dec) {
        _decorator = dec;
    }

    public void withdraw(int amount) {
        _decorator.withdraw(amount);
    }

    public void deposit(int amount) {
        _decorator.deposit(amount);
    }

     public int getBalance() {
        return _decorator.getBalance();
    }
}   

Esta classe não altera em nada o comportamento do objecto que esteja a ser decorado.  Cada novo comportamento será representado por uma classe distinta que herda da classe BannkAccountDecorator. Assim, o novo comportamento de vigilância, será concretizado pela seguinte classe:

public class SupervisionDecorator extends BankAccountDecorator {

    public SupervisionDecorator(BankAccountDecorator dec) {
        super(dec);
    }

    public void withdraw(int amount) {
        super.withdraw(amount);
        BankSupervision.register(this, false, amount);
    }

    public void deposit(int amount) {
        super.deposit(amount);
        BankSupervision.register(this, true, amount);
    }
}   

Note que não é necessário substituir o método getBalance porque não se quer alterar o comportamento deste método. Assim, pode-se utilizar simplesmente a versão já definida na super classe.