بسم الله الرحمن الرحيم
الحلقة الثانية : Command Pattern
نمط الأوامر أو Command Pattern , يوفر لنا هذا النمط تنفيذ وظيفة ما Command , ويختلف أداء هذه الوظيفة علي حسب طريقة تناولها implementation
علي سبيل المثال ربما تكون تملك مروحة كهربائية Fan ومصباح كهربائي كلاهما بهما وظيفة الفتح CommandOn ووظيفة الإغلاق CommandOff
ولكن عند تنفيذ هذه الأوامر سوف تختلف نتيجة التنفيذ حسب طبيعة الحاله , فلو نفذنا مثلا الأمر CommandOff علي المصباح فسوف ينطفئ النور , ولو تم تنفيذه علي المروحة لتوقفت المروحة عن الدوران , وهكذا
لذلك نخلص مما سبق أننا ربما أثناء إجراء معالجة برمجية لحالة ما , ربما نواجه حالات متشابهه في أوامرها ولكن تختلف في أدائها , لذلك نلجئ في هذه الحالات لتطبيق مفهوم نمط الأوامر Command Pattern
مثال تطبيقي لتوضيح هذا النمط
دعنا نتناول برمجة صفحة تسجيل دخول بسيطة login page حتي تتضح الصورة
معطيات الحالة :
يجب أن توفر هذه الصفحة الأوامر Commands التالية
- التأكد من بيانات تسجيل الدخول LoginCommandAction
- إستعادة كلمة السر ForgetPwdCommandAction
- تسجيل بيانات عضو جديد RegisterCommandAction
العمل :
يمكننا ملاحظة أن هذه المعطيات ما هي إلا أوامر تجمعها وجهة واحدة وهي تنفيذ عملها Action عند حدوث إرسال للبيانات Data Submiting
لذلك لو أخذنا برهة من التفكير , لوجدنا أن انسب حل لهذه الحالة يتوافق مع نمط الأوامر Command Pattern

الحل :
<?
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>إلي اللقاء بإذن الله مع نمط جديد
وبالله التوفيق
والسلام عليكم ورحمة الله وبركاته
