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

دروس في التصاميم النمطية

مغلق
بدأه MEMONONO في 24 أغسطس 2006 · 22 رد · 3,761 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

التصاميم النمطية

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

مقدمة

هذه دروس مترابطة متسلسة لشرح ما يعرف بالتصاميم النمطية. أحببت أن أقدم هذه الدروس لدارسي علوم الحاسب الآلي و هندسة البرمجيات و المصممين العرب. هذه الدروس مشهورة باللغة الانجليزية و متوفرة في كل مكان. ولكن إيمانا مني أنه يجب علي كمهندس برمجيات توفير هذا المحتوى بلغتي الأم – العربية – لكي يكون متاحا للجميع. وهذا يعني أن المنتج الذي اضعه بين يدي القارئ ليس ترجمة بل عبارة عن حصيلة دراسية و تجريبية مع الاعتماد على مجموعة من المصادر التي أدين لها بالفضل. آمل أن تكون الدروس ذات فائدة و ليس على القاريء غير القراءة والاستيعاب والنقد قدر المستطاع للتحسين المستمر.

مدخل إلى التصاميم النمطية

إن التصاميم النمطية ليست إلا تصاميم بسيطة قام بوضعها المصممين المتمرسين لحل مشكلة تصميمية متكررة. بمعنى آخر ، قد تمر على المصمم في مرحلة التصميم البرمجي مشاكل يوجهها تتكرر عليه في كل مرة يصمم فيها برنامجاً ، لذا قد يأتي بتصميم صغير يحل فيه المشكلة ويحتفظ بالحل لوقت قد يحتاج إليه. فمثلا مشكلة دخول المستخدم إلى النظام ، هذه مشكلة متكررة في كل نظام تقريبا ، لذا فمن المفيد جدا أن يحتفظ المصمم بأفضل حل وجده لهذه المشكلة ليعيد استخدامها في المرات المقبلة.

لقد فكر ممارسوا التصميم البرمجي في أغلب المشاكل التي تواجههم بصفة متكررة ومن ثم وضعوا لها حلولا بسيطة و أطلقوا عليها التصاميم النمطية. وما على دارس التصاميم إلا أن يفهم هذه المشاكل ويعرف حلولها ، وعندما يبدأ في تصميم البرنامج يبدأ بملاحظة الأنماط المختلفة ويحاول اكتشاف فيما إذا كان هناك نمط متكرر منها أم لا. إذا فالهدف النهائي لمعرفة التصاميم النمطية هي توفير الوقت على المصمم في التفكير في الأشياء البسيطة وبالتالي استغلال الوقت في حل مشاكل أكثر تعقيداً.

شرح متطلبات المادة

يحتاج القارئ لمعرفة بعض الأشياء الأساسية التي أفترض وجودها عند الشرح ولن أقوم بالتطرق لها لأنها ليست في مقام الدروس. أهم متطلب لهذه الدروس هو الانخراط عملياً في تصميم البرامج ، فإذا كان القارئ لا يتبع أي منهج هندسي برمجي على الاطلاق فستكون المادة بلا فائدة مباشرة بالنسبة له. كذلك يجب معرفة أسس البرمجة الكائنية المنحى وعلى الأقل فك رموز النمذجة والرموز الهندسية مثل لغة النمذجة الموحدة و غيرها. بالإضافة إلى ذلك كله ، فهذه الدروس ليست مصممة لشرح كيفية تصميم برنامج أو تعريف القارئ بمبادئ هندسة البرمجيات.

Design_Patterns___Introduction.pdf

_________________________.doc

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#2

التصاميم النمطية

نمط المصنع البسيط

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

post-21799-1156427924_thumb.jpg

post-21799-1156427950_thumb.jpg

post-21799-1156427974_thumb.jpg

public abstract class Meal
	{

		public abstract string GetMeal();
	}

public class KidsMeal : Meal
	{
		public override string GetMeal()
		{
			return "This is your hot Kids Meal";
		}
	}
public class NormalMeal : Meal
	{
		public override string GetMeal()
		{
		  return "This is your hot Normal Meal";
		}
	}

public class MealFactory
{
 public MealFactory(){}

 public Meal GetMeal(string order)
 {
	if (order == "kids")
	{
	  return new KidsMeal();
	}
	else
	{
	  return new NormalMeal();
	}
  }
}

public class Client
{
  static void Main(string[] args)
  {
   MealFactory restorant = new MealFactory();
   Meal MyMeal;
   Console.WriteLine("Client1: can you give me kids meal?");
   MyMeal = restorant.GetMeal("kids");
   Console.WriteLine( MyMeal.GetMeal() );

   Console.WriteLine("");

   Console.WriteLine("Client2: can you give me normal meal?");
   MyMeal = restorant.GetMeal("normal");
   Console.WriteLine( MyMeal.GetMeal());

   Console.Read();
  }
}

________________________________.doc

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#3

أفضل مشاهدة للمواضيع على:

المقدمة:

http://memonono.spaces.live.com/blog/cns...3!360.entry

الدرس ىالأول:

http://memonono.spaces.live.com/blog/cns...3!359.entry

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#4

جزاء الله خيرا يا اخي وكثر من امثالك في الوطن العربي .. انا التلميذة رقم 1

عندنا بالجامعة التعريب المتعارف عليه لDesign Patterns هو - النماذج التصميمية -

تم تعديل هذه المشاركة بواسطة nardien28 في 24 أغسطس 2006 في 19:00

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#5

شكرا أختي..

اقتباس
عندنا بالجامعة

أنا لم أكن أعرف أنهم يدرسوا بالعربي...

اقتباس
لDesign Patterns هو - النماذج التصميمية

بصراحة أنا لم يعجبني هذا التعريب أنا أرى

التصاميم النمطية...

أو الأنماط المتكررة (المفضلة عندي)....

عموما أنا عندي تصريحين...

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

الثاني-- وهنا تكون الروابط للدروس والنقاشات وذلك لسهولة التعديل واضافة الصور

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#6

(h) جزاء الله خيرا يا اخي .. انا التلميذ رقم 2

سؤال مهم بالنسبة لي كمبتدئ في هندسة البرمجيات

هل يوجد خلاف إذا كانت Meal من نوع interface ؟؟ أم هناك رؤية أخرى

تم تعديل هذه المشاركة بواسطة malek_sa في 26 أغسطس 2006 في 01:48

SCJP 5.0

#7

اذا سمحت اخ MEMONONO

سأرد على السؤال

اقتباس
هل يوجد خلاف إذا كانت Meal من نوع interface ؟؟ أم هناك رؤية أخرى

اذا كنت تنوي كتابة كود في احد الميثودات التابعة للـ Meal فهنا لايصح استخدام الـInterface

او ستلجا لتكرار الكود في جميع الكلاسات التي ستعمل implements للـinterface

لكن في الـ abstract يمكنك من كتابة ميثودات تحتوي اكواد

الخلاصة :

اذا كان الكلاس Meal لا يحتوي على اي كود مشترك لجميع الكلاس المتفرعة منه يمكنك استخدام interface )وحتى يمكنك استخدام abstract(

اما اذا كنت تنوي كتاب كود مشترك لجميع الكلاسات المتفرعة فلابد من ان تكون Meal من نوع abstract

ارجو ان تكون وصلت المعلومة

منقطع من حين لاخر

#8
اقتباس
اذا سمحت اخ MEMONONO

سأرد على السؤال

و لا يهمك عزيزي...

-------------------

هل أنتقل للدرس الثالث؟؟

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#9

لرؤية أفضل الرجاء الذهاب إلى:

http://memonono.spaces.live.com/blog/cns...3!362.entry

أو تحميل الملف المرفق.._________________.doc

التصاميم النمطية

نمط الكائن الوحيد

قد نمر بحالات معينة في تصميمنا بحيث يتطلب وجود كائن واحد فقط من صف معين ويجب أن لا نستطيع أن نكون كائناً آخر من نفس الصف. فعندما يتطلب برنامجا ما كائنا واحدا فقط ولا يحتمل أي نسخة أخرى من هذا الكائن فإننا نلجأ إلى نمط الكائن الوحيد. قد يعتقد البعض أن هذه الجالة نادرة ولكن في الحقيقة هي متطلبة في أغلب البرامج ومثال ذلك الصفوف الثابتة أو الساكنة أو حتى المتغيرات الثابتة أو الساكنة. فمثلا لو كانت أحد المتطلبات في برنامج ما أن لا يستطيع المستخدم الدخول إلى البرنامج مريتن في نفس اللحظة كنوع من الحماية بحيث لو دخل المستخدم إلى حسابه لن يستطيع أحد الدخول إليه حتى لو طابق إسم المستخدم وكلمة المرور.

post-21799-1157114344_thumb.jpg

post-21799-1157114344_thumb.jpg

public class SingletonException : Exception 

{ 

public SingletonException(string s): base(s) 

{ 

}  
}

public class user 

{ 

string username; 

string password; 

static bool IsCreated = false; 



private user(string name, string pass) 

{ 

this.username = name; 

this.password = pass; 

} 



public static user Login(string name, string pass) 

{ 

if (IsCreated) 

{ 

IsCreated = true; 

return new user(name, pass); 

} 

else 

{ 

throw new SingletonException("Sorry, you are already loged in"); 

} 

} 

}

public class Client 

{ 

public static void GO() 

{ 



Console.WriteLine("Please login to the system using your username and apssword"); 

Console.WriteLine("Logging in with wael and 1234...."); 

user usr = user.Login("wael", "1234"); 

Console.WriteLine("Logging in **again** with wael and 1234...."); 



try 

{ 

user anotherTry = user.Login("wael", "1234"); 

} 

catch(Exception e) 

{ 

Console.WriteLine(e+""); 



} 



Console.Read(); 

} 

}

جدول المصطلحات العربية والانجليزية

المصطلح العربي

المصطلح المقابل باللغة الإنجليزية

النمط الوحيد

Singleton Pattern

المتغير الساكن أو الثابت

Static Variable

الصف الثابت أو الساكن

Static Class

التصميم النمطي

Design Pattern

مرحلة التصميم البرمجي

Software Design Stage

نمط المصنع البسيط

Factory Pattern

البرمجة كائنية المنحى

Object Oriented Programming

صف

Class

لغة النمذجة الموحدة

Unified Modeling Language - UML

نمذجة

Modeling

post-21799-1157114369_thumb.jpg

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#10

تابع يا اخي ونحن متابعين معك بإذن الله

سؤال لا يتعلق بالدرس (لا تعصب) : هل البرنامج الذي تستخدمه في رسم مخططات UML هو SmartDraw

وان كان شيئا اخر (ولا عليك امر ) ممكن اسمه .

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#11

السلام عليكم

هناك طريقة اخرى لعمل Sigleton class


{

private static DBConnection con;

private DBConnection()
{
//write your init code
}

public static DBConnection getConnection()
{
if(con==null)
con= new DBConnection(); // or you can throw exception

return con;

}
}
public class DBConnection

ملاحظة حتى لو كان الـ Constructor فارغ فيجب كتابته و التاكد انه private

منقطع من حين لاخر

#12

لماذا لا نعدل على الكود السابق !

لنقم بتعريف المتغير con في البداية

و لتقم الدالة getConnection بارجاعه دون القيام بعملية الفحص التي ستسغرق وقت اضافي

ليصبح الكود


{

private static DBConnection con=new DBConnection;

private DBConnection()
{
//write your init code
}

public static DBConnection getConnection()
{
return con;
}
}
public class DBConnection()

منقطع من حين لاخر

#13

ممتاز ... الله يجزيكم الخير المواضيع جداً جميلة وممتعة .. شكراً لكما أخ MEMONONO وأخ أبو الفؤاد

سؤال قد لا يتعلق بالموضوع بشكل مباشر:

استخدام اتصال واحد مع الداتا بيز (أوبجكت واحد فقط يتصل بالDB) هل هو أفضل أم أأمن؟ !..

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#14

ولا يهمك استاذي....

اقتباس
استخدام اتصال واحد مع الداتا بيز (أوبجكت واحد فقط يتصل بالDB) هل هو أفضل أم أأمن؟

أعتقد الاثنان في وقت واحد...!!

افضل: لأنه واجهة واحدة وتستخدمه بطريقة واحدة لا تتغير... وكل ما تبغى شي من القاعدة تروح وتكلم الكائن هذا...

أأمن: لنفس السبب أنك تفتح مجال واحد للاتصال مع القاعدة وتخفي كل عمليات الاتصال مع القاعدة بالتالي تحميها من الاكتشاف...!!

مشكلة صغيرة: مع كائن واحد فقط ، تجد انك تكون عنق زجاجة وبالتالي مشكلة آداء!! وقد تحل المشكلة بجعل الكائن الوكيل عن القاعدة هو الذي يتحكم في عدد الاتصالات مع القاعدة من مسبح للاتصالات وبالتالي تكون افضل وأأمن وأفضل أداء

---- أبو فؤاد الله ينور عليك ... طريقتك حلوة وتنفع برضو....

--- nardien28....

البيئة التي أعمل فيها:

الكود: Visual Studio 2005 Team System

النماذج:Visual Studio 2005 Team System

المحرر: Word 2007

المدونة:spaces.live

نظام التشغيل:Vista

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#15
action-smiley-088.gif رفعتلو ضغطو

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#16
MEMONONO كتب:
البيئة التي أعمل فيها:

الكود: Visual Studio 2005 Team System

النماذج:Visual Studio 2005 Team System

المحرر: Word 2007

المدونة:spaces.live

نظام التشغيل:Vista

اذا هيك .. خلونا عالورقة و القلم :D

SCJP 5.0

#17
اقتباس
ملاحظة حتى لو كان الـ Constructor فارغ فيجب كتابته و التاكد انه private

هذه ملاحظة مهمة راحت من بالي....

هذه الخطوة ضرورية وراح اضيفها الآن في المدونة....

الدرس اللي بعدو......

جاهزيييييييييييييييييييييييييييييييييين

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#18

لرؤية أفضل الرجاء الذهاب إلى:

http://memonono.spaces.live.com/blog/cns...3!366.entry

أو تحميل الملف المرفق>>>>>_____________________________.doc

التصاميم النمطية

نمط الوكيل

الوكيل عبارة عن صف مسؤول عن توفير مدخل إلى الصفوف الأخرى. يرسل الصف إلى الوكيل الطلب و من ثم يقوم الوكيل بايصال الطلب للصف المختص وبعد ذلك يرد الوكيل على الصف المرسل بدون أن يدري المرسل أي تفاصيل عن هذه العملية.

في المثال المقدم هنا يقوم المرسل بطلب ملف من الوكيل باستخدام بروتوكول Http ويرد عليه الوكيل بطلبه ومن ثم يطلب المرسل ملفا آخر ببروتوكول آخر FTP ويقوم نفس الوكيل بتلقي الطلب والرد عليه.

post-21799-1157551878_thumb.jpg

post-21799-1157551900_thumb.jpg

public class Proxy
	{
		public HttpHandeller HttpHandeller
		{
			get
			{
				throw new System.NotImplementedException();
			}
			set
			{
			}
		}

		public FtpHandeller FtpHandeller
		{
			get
			{
				throw new System.NotImplementedException();
			}
			set
			{
			}
		}

		public static string HandelRequest(String request)
		{
			char[] separator = new char[1];
			separator[0] = ':';
			string[] protocol = request.ToLower().Split(separator);
			switch (protocol[0])
			{
				case "http":
					return HttpHandeller.HandelRequest(request);
				case "ftp":
					return FtpHandeller.HandelRequest(request);
				default:
					return "Sorry cannot help you";
			}
		}
	}

public class HttpHandeller
	{
		public static string HandelRequest(string request)
		{
			return "Http response";
		}
	}

public class FtpHandeller
	{
		public static string HandelRequest(string request)
		{
			return "FTP response";
		}
	}

public class Client
	{
		public Proxy Proxy
		{
			get
			{
				throw new System.NotImplementedException();
			}
			set
			{
			}
		}

		public static void GO()
		{
			string http = "http://mySite.com/myHtmlFile.html";
			string ftp = "ftp://mySite.com/myHtmlFile.doc";

			Console.WriteLine("Sending request {0} ....\r\n{1}",http,Proxy.HandelRequest(http));
			Console.WriteLine("Sending request {0} ....\r\n{1}",ftp,Proxy.HandelRequest(ftp));
			Console.Read();
		}
	}

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#19

الله يعطيك العافية أخي MEMONONO

لكن كأنك هنا لم تأت بجديد ؟؟ فالـ proxy هو نفس الـ factory الذي شرحته في الدرس الأول ...

أم أن الفرق هنا في الـ static method ؟؟؟؟؟ :rolleyes:

تم تعديل هذه المشاركة بواسطة malek_sa في 14 سبتمبر 2006 في 00:05

SCJP 5.0

#20

سأفك اللصاق عن فمي لأحاول الإجابة حتى يأتي استاذنا وخبيرنا MeMoNoNo فإما أن يصفق لي أو يرمي بالتلميذة رقم 1 خارج الدرس .

الفرق هنا :

case "http": return HttpHandeller.HandelRequest(request);

ناتج عملية المطابقة في الصف الوكيل تنقلك لتنفيذ السلوك المتعلق ب http ذو الاسم ذاته .. أي تمرير استدعائك من لصف الوكيل الى الصف الأساسي HttpHandeller المسؤل عن معالجة الطلب فعليا .

الناتج هو تنفيذ سلوك ما لك بشكل غير مباشر

عملية المطابقة غير اساسية بل لزوم المثال لأن الهدف تمرير الاستدعاء من صفك الى صف اخر وليس انتقاء صف من صفين .

if (order == "kids"){ return new KidsMeal(); }

ناتج المطابقة في الطريقة المصنعة هو انشاءغرض ... لا أكثر

كما ان عملية المطابقة اساسية لأن الهدف انتقاء صف بين عدة صفوف ابناء لصف مجرد واحد .

واختيار الاستاذ للمثال في النمط الوكيل ذكي ..حيث اختار ان تكون HandelRequest ستاتيكية ليلفت النظر الى تنفيذ سلوك وليس الى انتاج أغراض عن HttpHandeller أو FtpHandeller

توضيح :

نموذج المصنع البسيط ينتمي لصنف من التصاميم النمطية يسمى التصاميم الانتاجية Creational وهي التصاميم النمطية التي تهدف الى إضافة بعض من التنظيم والتحكم الى عملية انشاء الأغراض .

ملاحظة : نموذج النمط الوحيد ينتمي لهذا الصنف من التصاميم أيضا .

وهدف نموذج المصنع البسيط هو تنظيم انشاء غرض من صف مجرد يعين من هو السلوك المشترك بين عدة صفوف بشكل عام ... وليس كيف أو ما هو

وتتمثل الية التنظيم هذه باختيار صف من عدة صفوف وارثة للصف المجرد تحوي سلوكيات مختلفة لطرقه methos المجردة.

و يتم ذلك باستدعاء الطريقة المصنعة من الصف المصنع التي تعطيها كوسيط أي علامة أو اشارة لتكون قادرة على تمييز الصف الذي تريده وتستجيب بإنشاء (تصنيع) غرض عن الصف الذي طلبته .

في المثال كان اعطاء الكلمة "kids" كوسيط للطريقة المصنعة لترد بإنشاء غرض من الصف KidsMeal

ولكنك لن تتعامل مع الصف KidsMeal ولن تعرف حتى اسمه

انت أنشأت مثيل instance عن الصف المعين للسلوك العام Meal واعطيت اشارة كلمة "kids" للطريقة المصنعة ومنه تحصل على السلوك المطلوب لوجبة الأطفال ( تمثيل الطريقة getMeal الخاص بالصف KidsMeal )

أي عملية انشاء الغرض KidsMeal ضمنية .

أما واعطاء الكلمة "normal" يجعل الطريقة المصنعة تنشئ غرض عن الصف NormalMeal

نمط الوكيل ينتمي لصنف من التصاميم النمطية يسمى التصاميم البنيوية Structural وهي التصاميم النمطية التي تسهل عملية التصميم بتوفير طرق بسيطة لتحقيق العلاقات بين الكيانات (صفوف وأغراض وواجهات) في النظام البرمجي .

حيث ان النمط الوكيل يمثل صف يعمل كواجهة تخاطب للتعامل مع صف أخر مخفي أي غير مسموح التعامل معه مباشرة .

(تذكر ريموت كونترول التلفاز بأزرار يمثل الوكيل عنك للتعامل مع التلفزيون عوضا عن فتح التلفزيون والتعامل مع تعقيداته مباشرة )

مثال عن النمط الوكيل :

Proxy.jpg

public interface PotOfTeaInterface {  public void pourTea();}

الصف الوكيل :

public class PotOfTeaProxy implements PotOfTeaInterface {  
   PotOfTea potOfTea;

   public PotOfTeaProxy() {}

   public void pourTea() {
	   potOfTea = new PotOfTea();
	   potOfTea.pourTea();
   }
}

والمطلوب منا انشاء غرض من الصف الوكيل واستدعاء الطريقة pourTea()

التي لا تحوي السلوك الفعلي المتوقع من pourTea() ..

هي مجرد باب مرور الى الطريقة الحقيقية .

كل ما تفعله هو إنشاء غرض من الصف PotOfTea واستدعاء الطريقة pourTea() الخاصة به التي تحوي السلوك الحقيقي المتوقع .

الصف المخفي .. ذو السلوك الفعلي pourTea :

public class PotOfTea implements PotOfTeaInterface {  
   public PotOfTea() {
	   System.out.println("Making a pot of tea");
   }

   public void pourTea() {
	   System.out.println("Pouring tea");
   }   
}

الصف العميل ( المستخدم للوكيل) :

class TestProxy {
   public static void main(String[] args) {
	   System.out.println("TestProxy: instantiating PotOfTeaProxy");
	   PotOfTeaInterface potOfTea = new PotOfTeaProxy();
	   System.out.println(" ");
	   System.out.println("TestProxy: pouring tea");
	   potOfTea.pourTea();
   }
}

ولكن هذا المثال (تمرير استدعاء طريقة من صف لصف اخر ) لا يوضح قوة نموذج النمط الوكيل لذلك اختارالأخ MeMoNoNo وضع مثال فعال .

لكنه نسي ان يوضح فيه أين يكمن النمط الوكيل بالضبط .

ملامح النمط الوكيل :

واجهةInterface يمثلها implements صفين :

  • الصف الذي يمنع التعامل معه مباشرة
    (تمثيل أو أكواد طرق الواجهة تحوي السلوك الفعلي ) ... نسميه a
    ممكن و ليس لازم يكون أكثر من صف واحد ... كمثال الأستاذ
  • الصف الوكيل
    وكيل عن صفوف برنامجك بالوصول الى الصف a ..
    ان كتابة كود طرق الواجهة في هذا الصف (من ضمنها استدعاء طريقة الصف a ذات الاسم ذاته).
    ومن ثم استدعائها في صفوف برنامجك يؤدي الى استدعاء طرق الصف a ذات الاسم نفسه .

الصف العميل ( لا علاقة له بالواجهة)

وهو الصف الذي يستخدم الصف الوكيل للوصول لسلوك الصف a

تماما كما توحي الكلمة Proxy ..تذكر هذا المثال دائما :

عندما تفتح موقع انترنت CGI-Proxy لفتح موقع انترنت محجوب من قبل الشبكة

(أي لن تفتحه بنفسك ) .. طبعا هذا ال CGI-Proxy لا يحوي شيئا من المحتويات التي تتوقعها من الموقع المحجوب .

ولكن يقوم هذا الCGI-Proxy باستدعاء الموقع المحجوب لمستعرضك بدلا ان يقوم مستعرضك بفتحه مباشرة .. وذلك بتخبئة الIP ( صفاتك وتفاصيلك ) الخاص بك واستخدام الIP الخاص به ( صفاته وتفاصيله )

لكنه سيقوم بفتح المواقع المحجوبة لمستخدمين قد لا يعرفون حتى معنى كلمة IP (اخفاء تفاصيل وتعقيدات التعامل مع المواقع المحجوبة عن المستخدمين ).

وانت مضطر للتعامل معه لأنه يملك مؤهلات وصلاحيات وطرق لاتملكها انت للتعامل مع المواقع المحجوبة .

لا تقارن الأكواد ببعضا.. قد تبدو متشابهة .. ولكن المفاهيم مختلفة بشكل كلي

العبرة بالتصاميم النمطية فهم فلسفة عملها (لذلك أوردت مثال CGI-Proxy)

ولماذا انت تستخدمها .. ومن ثم اكتبها بالطريقة التي تحبها .

أتمنى ان تكون استطعت التمييز بين نمط المصنع البسيط ونمط الوكيل .

وأتمنى ان يكون تمييزي انا صحيحا ..

تم تعديل هذه المشاركة بواسطة nardien28 في 18 سبتمبر 2006 في 15:43

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#21

معك حق ... الفرق واضح بين النموذجين ...

أهنئك على معلوماتك ...

SCJP 5.0

#22

شكرا لكي يا ناردين

واتمنى يا ملك انك استوعبت الفرق....

انا أعتذر على تأخيري نظرا لظروف سفري...

عموما شكرا لكل من يتابع الدروس..

وآخر درس سيكون عن كيفية الاستفادة منها.. وشكرح الفلسفة ورائها...

كل عام وانتم بخير واتمنى للجميع رمضانا كريما مباركا...

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#23

ملاحظات صغيرة:

أسلوب النمط الوحيد:

مثال أخي MEMONONO الأول، لا يمثل صراحة أسلوب النمط الوحيد،، بل ما فعله كان أسلوب عدم تكرار الكائنات المتساوية،، أو بمعنى آخر،، صنع طريقة جميلة لنجعل صناعة الأشياء محكومة بقوانين معينة!

النمط الوحيد هو ما طرحه أبو الفؤاد، وهو يمثل أنك لا تستطيع صنع إلا شيء واحد فقط من فئة معينة, مثل ConnectionDB.

مثال النمط الوحيد في الفئة ConnectionDB المقترح ضعيف قليلا أو به بعض المشاكل:

الفائدة المرجوة من النمط الوحيد هو وجود شيء واحد فقط من الفئة ConnectionDB.

1- المثال الأول مشكلته أنه من الممكن صناعة أكثر من ConnectionDB واحد إذا تعددت المسارات أو الخيوط أو Threads. يمكن حل هذه المشكلة بأن تجعل الطريقة:

public static synchronized ConnectionDB getConnection(){..}

2- مشكلة المثال الثاني أن صناعة ConnectionDB موجودة في بداية تحميل الفئة،، وهذه مشكلة... إن لم تكن كبيرة!!

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

-----

خذ هذا العمل...

public class DBFactory{
private static SpecialConnection con;
public static synchronized SpecialConnection getConnection()throws SQLException{
if(con==null) con = new  MySpecialConnection();
return con;
}
}

وربما يريد بعض الإخوة أن يسرعوا عملية تناول الاتصال... ولو أني لا أرى ذلك خاصة في مثال الاتصال ولكن لنكمل المثال:..

public class DBFactory{
private static SpecialConnection con;
public static synchronized SpecialConnection createConnection()throws SQLException{
if(con==null) con = new  MySpecialConnection();
return con;
}
public static SpecialConnection getCreatedConnection(){
return con;
}
}

يعني....

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

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