Extrair Interface.
Vários clientes estão usando a mesma parte da interface de uma classe. Outro caso: parte da interface em duas classes é idêntica.
Mova essa porção idêntica para sua própria interface.
##Exemplo
class Employee {
double getRate() { return rate; }
boolean hasSpecialSkill() { return special; }
}
class Timesheet {
double charge(Employee emp, int days) {
return emp.getRate() * days;
}
}interface Billable {
double getRate();
}
class Employee implements Billable {
public double getRate() { return rate; }
boolean hasSpecialSkill() { return special; }
}
class Timesheet {
double charge(Billable emp, int days) {
return emp.getRate() * days;
}
}##Por que refatorar
-
Interfaces são muito adequadas quando classes desempenham papéis especiais em diferentes situações. Use Extrair Interface para indicar explicitamente qual papel.
-
Outro caso conveniente surge quando você precisa descrever as operações que uma classe realiza em seu servidor. Se for planejado permitir, no futuro, o uso de servidores de múltiplos tipos, todos os servidores devem implementar a interface.
##Como refatorar
-
Crie uma interface vazia.
-
Declare as operações comuns na interface.
-
Declare as classes necessárias como implementadoras da interface.
-
Altere as declarações de tipo no código cliente para usar a nova interface.