Boa noite gente. Eu to com uma dúvida no padrão Command que consiste na chamada dos métodos de configuração de uma classe. Por favor, observem os códigos abaixo e o comentário no código de Remote Loader (que tem o método main):
package headfirst.command.remote;
public class Stereo {
String location;
boolean on;
public Stereo(String location) {
this.location = location;
}
public void on() {
on = true;
System.out.println(location + " stereo is on");
}
public void off() {
on = false;
System.out.println(location + " stereo is off");
}
public void setCD() {
if(on)
System.out.println(location + " stereo is set for CD input");
}
public void setDVD() {
if(on)
System.out.println(location + " stereo is set for DVD input");
}
public void setRadio() {
if(on)
System.out.println(location + " stereo is set for Radio");
}
public void setVolume(int volume) {
// code to set the volume
// valid range: 1-11 (after all 11 is better than 10, right?)
if(on)
System.out.println(location + " Stereo volume set to " + volume);
}
}
package headfirst.command.remote;
public class StereoOnWithCDCommand implements Command {
Stereo stereo;
public StereoOnWithCDCommand(Stereo stereo) {
this.stereo = stereo;
}
public void execute() {
stereo.on();
stereo.setCD();
stereo.setVolume(11);
}
}
package headfirst.command.remote;
public class RemoteLoader {
public static void main(String[] args) {
RemoteControl remoteControl = new RemoteControl();
Light livingRoomLight = new Light("Living Room");
Light kitchenLight = new Light("Kitchen");
CeilingFan ceilingFan= new CeilingFan("Living Room");
GarageDoor garageDoor = new GarageDoor("");
Stereo stereo = new Stereo("Living Room");
//stereo.setVolume(11);
// o método setVolume só terá o seu conteúdo executado se uma
// variável 'on' estiver configurada como true.
/* Este é um grande problema:
* stereo.on();
* stereo.setVolume(11);
* O problema está no fato de que só deveria ser possível ligar o aparelho
* através de um comando como StereoOnWithCDCommand() e não diretamente por main!
*/
LightOnCommand livingRoomLightOn =
new LightOnCommand(livingRoomLight);
LightOffCommand livingRoomLightOff =
new LightOffCommand(livingRoomLight);
LightOnCommand kitchenLightOn =
new LightOnCommand(kitchenLight);
LightOffCommand kitchenLightOff =
new LightOffCommand(kitchenLight);
CeilingFanOnCommand ceilingFanOn =
new CeilingFanOnCommand(ceilingFan);
CeilingFanOffCommand ceilingFanOff =
new CeilingFanOffCommand(ceilingFan);
GarageDoorUpCommand garageDoorUp =
new GarageDoorUpCommand(garageDoor);
GarageDoorDownCommand garageDoorDown =
new GarageDoorDownCommand(garageDoor);
StereoOnWithCDCommand stereoOnWithCD =
new StereoOnWithCDCommand(stereo);
StereoOffCommand stereoOff =
new StereoOffCommand(stereo);
remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);
remoteControl.setCommand(1, kitchenLightOn, kitchenLightOff);
remoteControl.setCommand(2, ceilingFanOn, ceilingFanOff);
remoteControl.setCommand(3, stereoOnWithCD, stereoOff);
System.out.println(remoteControl);
remoteControl.onButtonWasPushed(0);
remoteControl.offButtonWasPushed(0);
remoteControl.onButtonWasPushed(1);
remoteControl.offButtonWasPushed(1);
remoteControl.onButtonWasPushed(2);
remoteControl.offButtonWasPushed(2);
remoteControl.onButtonWasPushed(3);
remoteControl.offButtonWasPushed(3);
}
}
Esse código está violando o encapsulamento, não está ? se eu puder chamar o método on() e quaisquer outros métodos eu farei o programa ficar ambíguo né ? eu poderei chamar os métodos citados tanto através de main quanto pela classe de comando! :shock: