سب کو سلام، فورم کے اراکین!
میں نے اچھی طرح سے (یہ مجھے لگتا ہے) پیٹرن کا پتہ لگا لیا ہے
Command
اور میں اس کے بارے میں "اپنے الفاظ میں" بات کرنے کی کوشش کرنا چاہتا ہوں۔
ویکیپیڈیا کی بنیاد پر، ہم یہ جان سکتے ہیں کہ اس کا مقصد
ایک ایسا ڈھانچہ بنانا ہے جس میں بھیجنے والی کلاس اور وصول کرنے والی کلاس ایک دوسرے پر براہ راست انحصار نہ کریں۔ کسی کلاس میں کال بیک کا اہتمام کرنا جس میں بھیجنے والی کلاس شامل ہو ۔ اصولی طور پر، یہ واضح طور پر اور صحیح طریقے سے لکھا جاتا ہے، لیکن یہ نظریہ میں ہے. یہ کیسے کریں؟ یہیں سے مسائل شروع ہوتے ہیں، کیونکہ... تفصیل اب اتنی واضح اور واضح نہیں ہے۔ لہذا، میں نے اس کا اندازہ لگایا، میں نے آپ کو یہ بتانے کا فیصلہ کیا کہ میں اسے کیسے سمجھتا ہوں، ہوسکتا ہے کہ یہ کسی کے لیے مفید ہو: اس پیٹرن کے مقصد کی وضاحت کی بنیاد پر، میں اس کو مزید واضح کرنے کے لیے تفصیل کو کوڈ کے ساتھ جوڑ دوں گا، کیونکہ اسی ویکیپیڈیا میں انہوں نے اسے بہت سی زبانوں کے لیے عام کیا اور اس لیے تفصیل کو مثال سے الگ کر دیا گیا ہے۔ اس پیٹرن میں چار اصطلاحات ہیں، آئیے ان کو ابھی کے لیے مان لیں: commands(
command
) , command receiver(
receiver
) , command caller(
invoker
) اور client(
client
)۔ میں اسی وکی پیڈیا سے ایک مثال لوں گا، یہ کافی قابل برداشت ہے۔
ٹاسک ایک کلاس ہے
Light
جو دو کام کر سکتی ہے: لائٹ آن کریں اور آف کریں۔
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");
}
}
آئیے ایک طریقہ کے ساتھ ایک انٹرفیس بنائیں جو عمل میں آئے اور جسے "command ( )" پیٹرن
execute()
کے لحاظ سے کہا جاتا ہے۔
command
public interface Command{
void execute();
}
طبقاتی مہارتوں کے نفاذ کو سمیٹنا ضروری ہے
Light
۔ ایسا کرنے کے لیے، ہم کلاسز بنائیں گے
TurnOnLightCommand
اور
TurnOffLightCommand
وہ انٹرفیس کو نافذ کریں گے
Command
اور جو کنسٹرکٹر میں کلاس آبجیکٹ کو قبول کرے گا
Light
۔ اور ان میں سے ہر ایک صرف ایک عمل کرے گا۔ ایک طریقہ کو کال کرے گا
turnOn()
، اور دوسرا کال کرے گا
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();
}
}
اب وقت آگیا ہے کہ ایک ایسی آبجیکٹ بنائیں جو ان انکیپسلیٹڈ آبجیکٹ طریقوں کو قبول کرے
Light
۔ پیٹرن کے لحاظ سے، اسے کمانڈ کالر (دعوت کرنے والا) کہا جاتا ہے۔ آئیے اسے کال کریں
Switch
اور اسے کنسٹرکٹر میں متغیرات کو قبول کرنے دیں
Command
جو بنائے گئے طریقوں میں استعمال ہوں گے
flipUp()
اور
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();
}
}
اور یقیناً، ہم ایک ایسی کلاس بنائیں گے جو انہیں یہ سمجھنے کے لیے استعمال کرے گی کہ عام طور پر کیا ہو رہا ہے۔ اسے مرکزی طریقہ کہا جائے گا، جس میں تمام کارروائیاں ہوں گی:
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();
}
}
آؤٹ پٹ مندرجہ ذیل ہو گا:
"The light is on"
"The light is off"
یہ کہاں لاگو ہوتا ہے؟
مقصد واضح ہے کہ اس کی کیا اور کیوں ضرورت ہے، یعنی: ایسی صورت حال میں جہاں آپ کو ایک مخصوص عمل کو الگ کرنے کی ضرورت ہے، یہ بہت آسان ہے۔ تاکہ کچھ فنکشنز کا استعمال کسی مخصوص نفاذ پر منحصر نہ ہو اور اسے سسٹم کو نقصان پہنچائے بغیر تبدیل کیا جا سکے۔ کچھ اس طرح...) اپنے تبصرے لکھیں، آئیے بحث کرتے ہیں، ہو سکتا ہے کچھ آسان بنایا جا سکے اور بہتر بتایا جا سکے، ضرورت پڑنے پر ہم ہر چیز میں ترمیم کر دیں گے) تاکہ جو لوگ پہلی بار پڑھیں گے، ان کے لیے یہ ممکن حد تک واضح ہو۔ ٹھیک ہے، جو بھی مضمون پسند کرتا ہے وہ اس پر "+" لگاتا ہے :) یہ میرے لیے اہم ہے) وقت گزرنے کے ساتھ، میں اور دیگر کے بارے میں مزید لکھنا چاہتا
Builder
ہوں
Singleton
۔
میرے دوسرے مضامین بھی دیکھیں:
GO TO FULL VERSION