Achei que a solução de exemplo dada repetia muito código nas classes Luz e Ar Condicionado e bolei uma solução para não ter que repetir tanto código:
public interface Controlavel {
void ligar();
void desligar();
}
// DispositivoBase.java (classe abstrata com a lógica comum)
public abstract class DispositivoBase implements Controlavel {
private boolean ligado = false;
// Para personalizar o nome que sai na mensagem
protected abstract String nome();
@Override
public void ligar() {
if (!ligado) {
ligado = true;
System.out.println(nome() + " ligado.");
} else {
System.out.println(nome() + " já está ligado.");
}
}
@Override
public void desligar() {
if (ligado) {
ligado = false;
System.out.println(nome() + " desligado.");
} else {
System.out.println(nome() + " já está desligado.");
}
}
// Se precisar expor o estado:
public boolean isLigado() {
return ligado;
}
}
// ArCondicionado.java
public class ArCondicionado extends DispositivoBase {
@Override
protected String nome() {
return "Ar-condicionado";
}
}
// Luz.java
public class Luz extends DispositivoBase {
@Override
protected String nome() {
return "Luz";
}
}
//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
public static void main(String[] args) {
Luz luz = new Luz();
ArCondicionado ar = new ArCondicionado();
luz.ligar();
luz.ligar();
luz.desligar();
ar.desligar();
}
}