وضع الإستراتيجية لبرمجة وضع دلفي (تابع)
ليو يي
1.3 تطبيق النموذج الاستراتيجي في نظام إدارة الفنادق
في أنظمة إدارة الفنادق، عادة ما يكون سعر الغرفة غير ثابت. يجب أن تكون هناك استراتيجيات مبيعات مختلفة في غير موسمها ومواسم الذروة للإقامة والعملاء القدامى والعملاء الجدد والضيوف الأفراد والمجموعات. من الواضح أن استراتيجية المبيعات تحدد العرض. ومع ذلك، لا يمكن ربط نظام عرض الأسعار القائم على استراتيجية المبيعات بعميل معين، لأنه فقط من خلال جعل نظام عرض الأسعار يعتمد على استراتيجية المبيعات مستقلاً يمكن ضمان إمكانية إعادة استخدامه وقابلية صيانته. على سبيل المثال: من ناحية، يلبي نظام عرض الأسعار احتياجات العديد من العملاء مثل الاستفسار عن سعر الغرفة التفضيلي وتسوية الغرفة؛ ومن ناحية أخرى، فإنه يلبي احتياجات التعديل المستمر لاستراتيجيات المبيعات الجديدة، وهذا يمكن أن يحقق حقًا إمكانية إعادة الاستخدام وقابلية الصيانة . بالنسبة لمتطلبات التصميم المذكورة أعلاه، من الأفضل اختيار وضع الإستراتيجية. يتيح نمط الإستراتيجية تغييرات الخوارزمية بشكل مستقل عن العميل الذي يستخدمه. نموذج البرنامج عبارة عن وحدة استعلام عن أسعار الإسكان التفضيلية تعتمد على نموذج الإستراتيجية، والذي يتضمن نظام عرض أسعار يعتمد على إستراتيجية المبيعات وواجهة استعلام عن أسعار الإسكان التفضيلية. بالطبع، تعد واجهة الاستعلام عن الأسعار التفضيلية واحدة فقط من عملاء نظام عرض الأسعار، ويمكن أيضًا استخدام نظام عرض الأسعار من قبل عملاء آخرين. يظهر تصميم وحدة الاستعلام عن الأسعار التفضيلية في الشكل 1-6. وهي تتضمن: · فئة استراتيجية المبيعات TSaleStrategy، وهي فئة أساسية مجردة لفئات محددة من استراتيجيات المبيعات. · 3 فئات محددة لاستراتيجية المبيعات: TVipStrategy (استراتيجية مبيعات بطاقات VIP)، TTeamStrategy (استراتيجية مبيعات الفريق)، TSeasonStrategy (استراتيجية المبيعات الموسمية). · فئة التسعير TPRiceContext، وهو السياق في نمط الإستراتيجية هذا ويحمل إشارة إلى TStrategy. · فئة العميل TClient عبارة عن فئة نموذجية، وهي عبارة عن واجهة للاستعلام عن أسعار المنازل. الشكل 1-6 نموذج البرنامج 1-1 لوحدة الاستعلام عن سعر الغرفة التفضيلي استنادًا إلى نمط الإستراتيجية هو الكود المصدري لوحدة HotelSaleStrategy. تحتوي هذه الوحدة على منطق الأعمال لنظام عرض الأسعار استنادًا إلى إستراتيجية المبيعات ويتم تنفيذها باستخدام نمط الاستراتيجية. باعتبارها الفئة الأساسية المجردة لاستراتيجية المبيعات، تهدف TSaleStrategy إلى توفير واجهة مشتركة. تعتبر الدالة التجريدية الافتراضية SalePrice بمثابة واجهة من هذا القبيل. نظرًا لأن استراتيجيات المبيعات الثلاثة المحددة تمت صياغتها بناءً على الموسم وبطاقة VIP وحجم الفريق، فإن تصميم المعلمات لواجهة الفئة الأساسية SalePrice يجب أن يلبي الاحتياجات المختلفة للفئات الثلاثة المشتقة. يتم تعريف وظيفة SalePrice في TSaleStrategy على النحو التالي: الدالة SalePrice(price:Currency;value:integer):Currency; Abstract; تمثل المعلمة الأولى السعر الثابت الوارد، وتمثل المعلمة الثانية الشروط التفضيلية الواردة لمختلف الفئات المشتقة. في استراتيجية المبيعات الموسمية TSeasonStrategy، يتم التعبير عن هذه المعلمة كشهر تسجيل الوصول؛ وفي استراتيجية مبيعات بطاقة VIP TVIPStrategy، يتم التعبير عن هذه المعلمة كنوع بطاقة VIP؛ في استراتيجية مبيعات الفريق TTeamStrategy، يتم التعبير عن هذه المعلمة كـ عدد الأشخاص في الفريق. لقد وجدنا أن هذه المعلمات يمكن أن تستخدم جميعها أنواعًا صحيحة، لذلك في الفئة الأساسية، يتم استخدام معلمة القيمة بذكاء لحل متطلبات المعلمات المختلفة للفئة المشتقة. بهذه الطريقة، يمكن لـ TPriceContext وضع البيانات مباشرة في المعلمات وتمريرها إلى عمليات استراتيجية مبيعات مختلفة، وتجنب تكرار المعلمات. وظيفة {TPriceContext } TPriceContext.GetPrice(price:Currency;value:integer):Currency;begin result:=Strategy.SalePrice(price,value);end;يلعب TPriceContext دورًا سياقيًا في وضع الإستراتيجية هذا ويكون مسؤولاً عن الإشارة إلى المبيعات الإستراتيجية تستدعي المثيلات المختلفة للكائن واجهة SalePrice لتكوين خوارزمية الخصم المحددة ديناميكيًا وإرجاع سعر البيع الفعلي. نظرًا لوسيط TPriceContext، لا يحتاج العميل إلى معرفة كيفية تنفيذ استراتيجية المبيعات المحددة؛ وبالمثل، عندما يتم تحديث استراتيجية المبيعات وتعديلها، لن يكون لها أي تأثير على برنامج العميل. نموذج برنامج 1‑1 كود مصدر وحدة HotelSaleStrategy HotelSaleStrategy؛ واجهات SysUtils وWindows وMessages وClasses وGraphics وControls وForms وDialogs؛ اكتب TSaleStrategy = وظيفة عامة فئة (TObject) SalePrice(price:Currency;value:integer): العملة ; virtual; end; SalePrice(price:Currency;value:integer):Currency; end; TTeamStrategy = class (TSaleStrategy) وظيفة عامة SalePrice(price:Currency;value:integer):Currency; end; (TObject) Private FStrategy: TSaleStrategy؛ الإجراء SetStrategy(Value: TSaleStrategy); الوظيفة العامة GetPrice(price:Currency;value:integer):Currency; TSeasonStrategy.SalePrice(price:Currency;value:integer):Currency;begin //استراتيجية المبيعات الموسمية {خصم 15% في فبراير ومارس ونوفمبر، وخصم 10% في أبريل ويونيو. 8. خصم 9.5% في شهر سبتمبر. } قيمة الحالة 2,3,11:result:=price*0.85; 4,6:result:=price*0.9; 8,9:result:=price*0.95; TVIPStrategy }وظيفة TVIPStrategy.SalePrice(price:Currency;value:integer):Currency;begin //استراتيجية مبيعات بطاقات VIP{ 0: خصم 10% لبطاقة VIP الفضية 1: خصم 20% لبطاقة VIP الذهبية 2: خصم 30% لبطاقة VIP الماسية} قيمة الحالة 0:result:=price*0.9; 1:result:=price*0.8; :result: =price*0.7;end;end;{TTeamStrategy }function TTeamStrategy.SalePrice(price:Currency;value:integer):Currency;begin // استراتيجية مبيعات الفريق {خصم 10% لفريق مكون من 3-5 أشخاص؛ خصم 20% لفريق مكون من 6-10 أشخاص؛ خصم 30% لـ فريق مكون من 11-20 شخصًا؛ 20 خصمًا بنسبة 40% للمجموعات التي تضم أكثر من شخص واحد. } النتيجة:=السعر؛ إذا كانت (القيمة<6) و(القيمة>2) فإن النتيجة:=السعر*0.9؛ 21) و (القيمة> 10) ثم النتيجة: = السعر * 0.7؛ إذا كانت (القيمة> 20) فإن النتيجة: = السعر * 0.6؛ النهاية؛ {TPriceContext } الدالة TPriceContext.GetPrice(price:Currency;value:integer):Currency;begin result:=Strategy.SalePrice(price,value);end;إجراء TPriceContext.SetStrategy(Value: TSaleStrategy);begin FStrategy:=Value;end;end. يظهر برنامج العميل الخاص بوحدة الاستعلام عن سعر الغرفة التفضيلي في نموذج البرنامج 1-2. يوفر البرنامج واجهة اختيار المستخدم حتى يتمكن المستفسر من اختيار الخطة التفضيلية. بمجرد تحديد الشروط التفضيلية والأسعار العامة، انقر فوق الزر "التحقق من الأسعار التفضيلية" للحصول على الأسعار المخفضة. يظهر تأثير التشغيل الفعلي في الشكل 1-7. نموذج برنامج 1‑2 وحدة التعليمات البرمجية المصدرية لوحدة ClientForm ClientForm؛ يستخدم واجهة Windows، والرسائل، وSysUtils، والمتغيرات، والفئات، والرسومات، وعناصر التحكم، والنماذج، ومربعات الحوار، وStdCtrls، وExtCtrls، وHotelSaleStrategy، وComCtrls، وDateUtils، اكتب TClient = class(TForm) RadioGroup1: TRAdioGroup; BtnExit: TButton; TBevel; إنشاء نموذج الإجراء (المرسل: TObject); الإجراء btnCheckClick(Sender: TObject); الإجراء FormDestroy(Sender: TObject); الإجراء btnExitClick(Sender: TObject); الإجراء RadioGroup1Click(Sender: TObject); : TPriceContext public { الإعلانات العامة } end;var Client: TClient;implementation{$R *.dfm}procedure TClient.FormCreate(Sender: TObject);begin FSeasonStrategy:=TSeasonStrategy.Create; ; FPriceSys:=TPriceContext.Create;end;إجراء TClient.btnCheckClick(Sender: TObject);var i:integer; .التاريخ والوقت)؛ النهاية؛ 1:البدء FPriceSys.Strategy:=FVIPStrategy ; i:=cmbVIP.ItemIndex; end; 2:begin FPriceSys.Strategy ; i:=StrToInt(edtCount.Text end; 300; // الغرفة القياسية من الفئة أ 300 يوان 1:price:=500; // الغرفة القياسية من الفئة ب 500 يوان 2: السعر: = 800؛ // غرفة كبار الشخصيات 800 يوان 3: السعر: = 1000؛ // جناح الأعمال 1000 يوان 4: السعر: = 2000؛ // جناح ديلوكس 2000 yuanend; edtPrice .Text:=CurrToStr(FPriceSys.GetPrice(price,i));end;إجراء TClient.FormDestroy(Sender: TObject); start FPriceSys.Free; FVIPStrategy.Free;end; الإجراء TClient.btnExitClick(Sender: TObject); edtCount.Enabled:=false; cmbVIP.Enabled:=false; case RadioGroup1.ItemIndex of 0:dtpDate.Enabled:=true; الشكل 1-7 واجهة التشغيل الفعلية لوحدة الاستعلام عن الأسعار التفضيلية
1.4 ملخص الممارسة
ومن خلال عرض وتحليل الأمثلة السابقة، سنناقش نمط الإستراتيجية على النحو التالي: · يوفر نمط الإستراتيجية طريقة لإدارة مجموعة من الخوارزميات. يحدد التسلسل الهرمي لفئات الإستراتيجية سلسلة من الخوارزميات أو السلوكيات القابلة لإعادة الاستخدام لـ TContext. تستخرج الفئة الأساسية TStrategy الوظائف المشتركة في هذه الخوارزميات، وتقوم الفئات المشتقة بإثراء اختلافات وأنواع الخوارزميات من خلال الميراث، وتجنب تكرار التعليمات البرمجية. · إذا لم تقم بفصل الخوارزمية عن السياق الذي يتم استخدام الخوارزمية فيه، وقمت مباشرة بإنشاء فئة مشتقة من فئة TContext التي تحتوي على الخوارزمية، ومنحها سلوكيات مختلفة، سيؤدي ذلك إلى تشفير السلوك في TContext، و يتم فصل تنفيذ الخوارزمية عن TContext. يتم خلط عمليات التنفيذ، مما يجعل من الصعب فهم TContext وصيانته وتوسيعه. والنتيجة النهائية هي مجموعة من الفئات ذات الصلة، والفرق الوحيد بينهما هو الخوارزمية التي يستخدمونها. من الواضح أن علاقة الميراث بين الفئات هي ارتباط قوي، ولا يمكن لعلاقة الميراث أن تغير الخوارزمية ديناميكيًا؛ في حين أن علاقة تكوين الكائنات هي ارتباط ضعيف، فمن خلال الجمع بين كائنات فئة الإستراتيجية، يمكن أن تتطور الخوارزمية بشكل مستقل عن البيئة (TContext). حيث يتم استخدام الخوارزمية. · استخدم نمط الإستراتيجية لإعادة صياغة رموز البرامج التي تستخدم عددًا كبيرًا من عبارات الفروع الشرطية. عندما يتم تكديس سلوكيات مختلفة في الفصل الدراسي، فمن الصعب تجنب استخدام العبارات الشرطية لتحديد السلوك المناسب. يؤدي تغليف السلوك في فئات سياسة منفصلة إلى إزالة هذه العبارات الشرطية. · الكثير من الخوارزميات قد يؤدي إلى عدد كبير من أهداف السياسة. من أجل تقليل حمل النظام، يمكن عادة حفظ الحالة التي تعتمد على بيئة الخوارزمية على العميل، ويتم تنفيذ TStrategy ككائن عديم الحالة يمكن مشاركته من قبل عملاء مختلفين. يتم الحفاظ على أي حالة خارجية بواسطة TContext. يقوم TContext بتمرير هذه الحالة في كل طلب إلى كائن TStrategy. على سبيل المثال، في نموذج البرنامج، أقوم بحفظ شهر تسجيل الحالة الخارجية لـ TSeasonStrategy، ونوع بطاقة VIP للحالة الخارجية لـ TVIPStrategy، وحجم فريق الحالة الخارجية لـ TTeamStrategy على العميل، وتمرير هذه الحالات إلى فئة استراتيجية المبيعات من خلال TPriceContext. وتتمثل ميزة ذلك في أن فئة استراتيجية المبيعات تصبح عديمة الحالة، ويمكن مشاركتها بواسطة وحدات نمطية أخرى مثل وحدة تسوية الغرفة. · بغض النظر عما إذا كانت الخوارزمية التي تنفذها كل استراتيجية محددة بسيطة أم معقدة، فإنها جميعًا تشترك في الواجهة التي تحددها TStrategy. ولذلك فمن المحتمل أن بعض السياسات المحددة لن تستخدم جميع المعلومات التي تم تمريرها إليها عبر هذه الواجهة. إذا قمت بتصميم واجهة TSaleStrategy مثل هذا في نموذج البرنامج:
SalePrice(price:Currency;Month:integer;VIP:integer;
العد:عدد صحيح):العملة؛
لن يتم استخدام بعض هذه المعلمات أبدًا بواسطة فئات معينة من استراتيجيات المبيعات. هذا يعني أنه في بعض الأحيان يقوم TContext بإنشاء وتهيئة معلمات لن يتم استخدامها أبدًا. إذا كانت هناك مثل هذه المشكلة ولم تتمكن من استخدام التقنيات الموجودة في نموذج البرنامج، فيمكنك فقط اعتماد أسلوب مقترن بإحكام بين TStrategy وTContext.
يمكن تنزيل المزيد من المقالات ذات الصلة ونماذج رموز مصدر البرنامج من موقع المؤلف: http://www.liu-yi.net