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.