📄 portegarage.java
字号:
package be.garage;
import java.util.Observable;
import java.util.Timer;
import be.garage.capteur.Alertable;
import be.garage.capteur.CapteurFermeture;
import be.garage.capteur.CapteurOuverture;
import be.garage.capteur.DetecterFinDureeOuverture;
public class PorteGarage extends Observable implements Alertable {
public enum EtatPorte {
OUVERTE, OUVRANTE, FERMEE, FERMANTE
}
public enum Evenement {
CLIC, OBSTACLE, FIN_DUREE_OUVERTURE, FIN_OUVERTURE, FIN_FERMETURE
}
private final static int DUREE_OUVERTURE = 4 * 1000;
private EtatPorte etat;
private boolean obstacle;
// simulation des moteurs
private final static int DUREE_EN_OUVERTURE = 2 * 1000;
private final static int DUREE_EN_FERMETURE = 2 * 1000;
private Timer enOuverture = new Timer();
private Timer enFermeture = new Timer();
private Timer ouverture = new Timer();
public PorteGarage() {
etat = EtatPorte.FERMEE;
}
private void arreterMoteur() {
ouverture.cancel();
enFermeture.cancel();
enOuverture.cancel();
}
private void fermer() {
arreterMoteur();
enFermeture = new Timer();
enFermeture.schedule(new CapteurFermeture(this), DUREE_EN_FERMETURE);
}
private void ouvrir() {
arreterMoteur();
enOuverture = new Timer();
enOuverture.schedule(new CapteurOuverture(this), DUREE_EN_OUVERTURE);
}
public void changerEtat(Evenement evenement) {
EtatPorte ancienEtat = etat;
switch (etat) {
case OUVERTE:
switch (evenement) {
case CLIC:
entry();
break;
case FIN_DUREE_OUVERTURE:
if (!obstacle) {
etat = EtatPorte.FERMANTE;
}
entry();
break;
}
break;
case OUVRANTE:
if (evenement == Evenement.FIN_OUVERTURE) {
etat = EtatPorte.OUVERTE;
entry();
}
break;
case FERMANTE:
switch (evenement) {
case CLIC:
case OBSTACLE:
etat = EtatPorte.OUVRANTE;
entry();
break;
case FIN_FERMETURE:
etat = EtatPorte.FERMEE;
entry();
break;
}
break;
case FERMEE:
if (evenement.equals(Evenement.CLIC)) {
etat = EtatPorte.OUVRANTE;
entry();
}
break;
}
if (ancienEtat != etat) {
setChanged();
notifyObservers();
}
}
private void entry() {
switch (etat) {
case OUVERTE:
arreterMoteur();
maintenirPorteOuverte();
break;
case OUVRANTE:
ouvrir();
break;
case FERMANTE:
fermer();
break;
case FERMEE:
arreterMoteur();
break;
}
}
private void maintenirPorteOuverte() {
arreterMoteur();
ouverture = new Timer();
ouverture
.schedule(new DetecterFinDureeOuverture(this), DUREE_OUVERTURE);
}
public EtatPorte getEtat() {
return etat;
}
public void finDureeOuverture() {
changerEtat(Evenement.FIN_DUREE_OUVERTURE);
}
public void finFermeture() {
changerEtat(Evenement.FIN_FERMETURE);
}
public void finOuverture() {
changerEtat(Evenement.FIN_OUVERTURE);
}
/**
* @param obstacle
* The obstacle to set.
*/
public void setObstacle(boolean obstacle) {
this.obstacle = obstacle;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -