مرحبا بالجميع أعضاء المنتدى!
لقد فهمت تمامًا (كما يبدو لي) هذا النمط
Command
وأريد أن أحاول التحدث عنه "بكلماتي الخاصة".
استنادًا إلى ويكيبيديا، يمكننا معرفة أن الغرض منه هو
إنشاء بنية لا تعتمد فيها الفئة المرسلة والفئة المتلقية بشكل مباشر على بعضهما البعض. تنظيم رد اتصال لفئة تتضمن فئة المرسل . من حيث المبدأ، هو مكتوب بشكل واضح وصحيح، ولكن هذا من الناحية النظرية. كيف نفعل ذلك؟ وهنا تبدأ المشاكل، لأن... لم يعد الوصف واضحًا وواضحًا. لذلك، فهمت ذلك، قررت أن أخبركم كيف فهمت ذلك، ربما يكون مفيدًا لشخص ما: بناءً على وصف الغرض من هذا النمط، سأقوم بدمج الوصف مع الكود لجعله أكثر وضوحًا، لأن وفي نفس ويكيبيديا عمموها على العديد من اللغات ولذلك تم فصل الوصف عن المثال. هناك أربعة مصطلحات في هذا النمط، لنأخذها كأمر مسلم به في الوقت الحالي: الأوامر (
command
)، ومستقبل الأوامر (
receiver
)، ومتصل الأوامر (
invoker
)، والعميل (
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");
}
}
لنقم بإنشاء واجهة بأسلوب واحد
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