Kumusta sa lahat, mga miyembro ng forum!
Naisip ko nang lubusan (parang sa akin) ang pattern
Command
at gusto kong subukang pag-usapan ito "sa sarili kong mga salita."
Batay sa Wikipedia, malalaman natin na ang layunin nito ay
lumikha ng isang istraktura kung saan ang klase ng pagpapadala at ang tumatanggap na klase ay hindi direktang umaasa sa isa't isa. Pag-aayos ng callback sa isang klase na kinabibilangan ng klase ng nagpadala . Sa prinsipyo, ito ay nakasulat nang malinaw at tama, ngunit ito ay nasa teorya. Paano ito gawin? Dito nagsisimula ang mga problema, dahil... ang paglalarawan ay hindi na masyadong malinaw at halata. Samakatuwid, naisip ko ito, nagpasya akong sabihin sa iyo kung paano ko ito naunawaan, marahil ito ay magiging kapaki-pakinabang sa isang tao: Batay sa paglalarawan ng layunin ng pattern na ito, isasama ko ang paglalarawan sa code upang gawing mas malinaw, kasi sa parehong Wikipedia ay ini-generalize nila ito para sa maraming wika at samakatuwid ang paglalarawan ay hiwalay sa halimbawa. Mayroong apat na termino sa pattern na ito, tanggapin natin ang mga ito para sa ngayon: commands(
command
), command receiver(
receiver
), command caller(
invoker
) at client(
client
). Kukuha ako ng isang halimbawa mula sa parehong Wikipedia, ito ay medyo matitiis.
Ang gawain ay isang klase
Light
na maaaring gumawa ng dalawang bagay: buksan ang ilaw at patayin ito. Sa mga tuntunin ng pattern ito ay magiging "command receiver (
receiver
)"
public class Light{
public Light(){ }
public void turnOn(){
System.out.println("The light is on");
}
public void turnOff(){
System.out.println("The light is off");
}
}
Gumawa tayo ng isang interface na may isang paraan
execute()
na ipapatupad at tinatawag sa mga tuntunin ng pattern na "command (
command
)"
public interface Command{
void execute();
}
Ito ay kinakailangan upang i-encapsulate ang pagpapatupad ng mga kasanayan sa klase
Light
. Upang gawin ito, gagawa kami ng mga klase
TurnOnLightCommand
at
TurnOffLightCommand
magpapatupad ng interface
Command
at kung saan ay tatanggap ng object ng klase sa constructor
Light
. At ang bawat isa sa kanila ay gagawa lamang ng isang aksyon. Ang isa ay tatawag sa pamamaraan
turnOn()
, at ang isa ay tatawag
turnOff()
.
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
public class TurnOffLightCommand implements Command{
private Light theLight;
public TurnOffLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOff();
}
}
Ngayon ay oras na upang lumikha ng isang bagay na tumatanggap ng mga naka-encapsulated object na pamamaraan na ito
Light
. Sa mga tuntunin ng pattern, ito ay tinatawag na command caller (invoker). Tawagan natin ito
Switch
at hayaan itong tanggapin ang mga variable sa constructor
Command
na gagamitin sa mga ginawang pamamaraan
flipUp()
at
flipDown()
.
public class Switch {
private Command flipUpCommand;
private Command flipDownCommand;
public Switch(Command flipUpCommand,Command flipDownCommand){
this.flipUpCommand=flipUpCommand;
this.flipDownCommand=flipDownCommand;
}
public void flipUp(){
flipUpCommand.execute();
}
public void flipDown(){
flipDownCommand.execute();
}
}
At siyempre, gagawa kami ng klase na gagamitin ang mga ito para maunawaan kung ano ang nangyayari sa pangkalahatan. Ito ay tatawaging pangunahing pamamaraan, kung saan ang lahat ng aksyon ay magaganap:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
Ang magiging output ay ang mga sumusunod:
"The light is on"
"The light is off"
Saan ito inilalapat?
Ang layunin ay malinaw kung ano at bakit ito kinakailangan, lalo na: sa isang sitwasyon kung saan kailangan mong paghiwalayin ang isang tiyak na pagpapatupad, ito ay napaka-maginhawa. Upang ang paggamit ng ilang mga pag-andar ay hindi nakasalalay sa isang tiyak na pagpapatupad at maaari itong mabago nang hindi napinsala ang system. ganito...) Isulat mo ang iyong mga komento, pag-usapan natin, baka may gawing mas simple at masabihan ng mas mahusay, i-edit natin ang lahat kung kinakailangan) Para sa mga unang magbabasa, ito ay malinaw hangga't maaari. Well, kung sino ang magustuhan ng artikulo ay naglalagay ng "+" dito :) Mahalaga ito para sa akin) Sa paglipas ng panahon, gusto kong magsulat ng higit pa tungkol sa
Builder
,
Singleton
at iba pa.
Tingnan din ang aking iba pang mga artikulo:
GO TO FULL VERSION