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.