الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحلقة الثانية : Command Pattern

مغلق
بدأه الحسين في 9 يناير 2005 · 0 رد · 1,089 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله الرحمن الرحيم

الحلقة الثانية : Command Pattern

نمط الأوامر أو Command Pattern , يوفر لنا هذا النمط تنفيذ وظيفة ما Command , ويختلف أداء هذه الوظيفة علي حسب طريقة تناولها implementation

علي سبيل المثال ربما تكون تملك مروحة كهربائية Fan ومصباح كهربائي كلاهما بهما وظيفة الفتح CommandOn ووظيفة الإغلاق CommandOff

ولكن عند تنفيذ هذه الأوامر سوف تختلف نتيجة التنفيذ حسب طبيعة الحاله , فلو نفذنا مثلا الأمر CommandOff علي المصباح فسوف ينطفئ النور , ولو تم تنفيذه علي المروحة لتوقفت المروحة عن الدوران , وهكذا

لذلك نخلص مما سبق أننا ربما أثناء إجراء معالجة برمجية لحالة ما , ربما نواجه حالات متشابهه في أوامرها ولكن تختلف في أدائها , لذلك نلجئ في هذه الحالات لتطبيق مفهوم نمط الأوامر Command Pattern

مثال تطبيقي لتوضيح هذا النمط

دعنا نتناول برمجة صفحة تسجيل دخول بسيطة login page حتي تتضح الصورة

معطيات الحالة :

يجب أن توفر هذه الصفحة الأوامر Commands التالية

- التأكد من بيانات تسجيل الدخول LoginCommandAction

- إستعادة كلمة السر ForgetPwdCommandAction

- تسجيل بيانات عضو جديد RegisterCommandAction

العمل :

يمكننا ملاحظة أن هذه المعطيات ما هي إلا أوامر تجمعها وجهة واحدة وهي تنفيذ عملها Action عند حدوث إرسال للبيانات Data Submiting

لذلك لو أخذنا برهة من التفكير , لوجدنا أن انسب حل لهذه الحالة يتوافق مع نمط الأوامر Command Pattern

Command%20Pattern.gif

الحل :

<?
class CommandAction
{
    function performAction() {
        die("performAction method must be implemented in " . get_class($this) . " class");
    }
}

class LoginCommandAction extends CommandAction
{
    function performAction() {
        if( $_POST["loginID"] == "elh"
            && $_POST["pwd"] == "123" ) {
            header("location: welcome.php");
            exit();
        }else {
            echo "<font color=red>sorry try again</font>";
        }
    }

}

class ForgetPwdCommandAction extends CommandAction
{
    function performAction() {
        header("location: ForgetPwd.php");
        exit();
    }

}

class RegisterCommandAction extends CommandAction
{
    function performAction() {
        header("location: register.php");
        exit();
    }

}

// at Post Back
if( count($_POST) > 0 ) {
    $commands = array("login" => "LoginCommandAction",
                      "forgetpwd" => "ForgetPwdCommandAction",
                      "register" => "RegisterCommandAction");

    foreach( $commands as $key => $value) {
        if( $_POST["act"] == $key ) {
            $cmd = new $value();  /* CommandAction Object */
            
            $cmd->performAction();
            break;
        }
    }

}
?>

<script language="javascript">

function OnPostBack(action) {
    var actElement = document.getElementById("act");
    actElement.value = action;
}
</script>

<form method="post">
 <input type="hidden" id="act" name="act" value="" />

 user name : <input type="text" name="loginID" /><br>
 password : <input type="password" name="pwd" />

 <input type="submit" value="log in" onclick="OnPostBack('login')" />
 <input type="submit" value="forget password" onclick="OnPostBack('forgetpwd')" />
 <input type="submit" value="register" onclick="OnPostBack('register')" />
</form>

كما نلاحظ من المثال السابق فقد قمنا بوضع الأوامر التي تتم في هذه الصفحة في مصفوفة تسمي commands كما يلي

    $commands = array("login" => "LoginCommandAction",
                      "forgetpwd" => "ForgetPwdCommandAction",
                      "register" => "RegisterCommandAction");

وقد قمنا بعمل فئة باسم CommandAction تكون الفئة الأم base class تحتوي علي وظيفة باسم performAction

يتم إعادة كتابة الكود بها في كل مرة يتم إشتقاق هذه الفئة بفئة أخري

class CommandAction
{
    function performAction() {
        die("performAction method must be implemented in " . get_class($this) . " class");
    }
}

ومن المعطيات تم تحديد الأوامر السابقة وتم عمل فئة خاصة لكل أمر علي حدي مشتقة من الفئة الأم CommandAction

class LoginCommandAction extends CommandAction
{
    function performAction() {
        if( $_POST["loginID"] == "elh"
            && $_POST["pwd"] == "123" ) {
            header("location: welcome.php");
            exit();
        }else {
            echo "<font color=red>sorry try again</font>";
        }
    }

}

class ForgetPwdCommandAction extends CommandAction
{
    function performAction() {
        header("location: ForgetPwd.php");
        exit();
    }

}

class RegisterCommandAction extends CommandAction
{
    function performAction() {
        header("location: register.php");
        exit();
    }

}

_______________________________________________________________________________________

كيف يمكننا تطبيق Command Pattern في الإصدار الخامس php5:

نتيجة التحسينات التي أدخلت علي هذا الإصدار فيمكننا إستبدال الفئة CommandAction بالواجهة ICommandAction

وبهذا يكون البناء بشكل أفضل

ويكون المثال كما يلي

<?
interface ICommandAction
{
    public function performAction();
}

class LoginCommandAction implements ICommandAction
{
    public function performAction() {
        if( $_POST["loginID"] == "elh"
            && $_POST["pwd"] == "123" ) {
            header("location: welcome.php");
            exit();
        }else {
            echo "<font color=red>sorry try again</font>";
        }
    }

}

class ForgetPwdCommandAction implements ICommandAction
{
    public function performAction() {
        header("location: ForgetPwd.php");
        exit();
    }

}

class RegisterCommandAction implements ICommandAction
{
    public function performAction() {
        header("location: register.php");
        exit();
    }

}


// at Post Back
if( count($_POST) > 0 ) {
    $commands = array("login" => "LoginCommandAction",
                      "forgetpwd" => "ForgetPwdCommandAction",
                      "register" => "RegisterCommandAction");

    foreach( $commands as $key => $value) {
        if( $_POST["act"] == $key ) {
            $cmd = new $value();  /* CommandAction Object */
            
            $cmd->performAction();
            break;
        }
    }

}
?>

<script language="javascript">

function OnPostBack(action) {
    var actElement = document.getElementById("act");
    actElement.value = action;
}
</script>

<form method="post">
 <input type="hidden" id="act" name="act" value="" />

 user name : <input type="text" name="loginID" /><br>
 password : <input type="password" name="pwd" />

 <input type="submit" value="log in" onclick="OnPostBack('login')" />
 <input type="submit" value="forget password" onclick="OnPostBack('forgetpwd')" />
 <input type="submit" value="register" onclick="OnPostBack('register')" />
</form>

إلي اللقاء بإذن الله مع نمط جديد

وبالله التوفيق

والسلام عليكم ورحمة الله وبركاته

PHP Command Pattern Examples.rar

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

هذا الموضوع مغلق.

مواضيع مشابهة