النمط القالبي هو نمط تصميمي سلوكي. يتم استخدام نمط تصميم النمط القالبي لإنشاء مكان للأسلوب وتأجيل بعض خطوات التنفيذ إلى الفصول الفرعية.
نمط تصميم النمط القالبي
يحدد الأسلوب القالبي الخطوات لتنفيذ خوارزمية ويمكنه توفير تنفيذ افتراضي قد يكون مشتركًا للجميع أو بعض الفصول الفرعية. دعونا نفهم هذا النمط بمثال، فلنفترض أننا نريد توفير خوارزمية لبناء منزل. الخطوات التي يجب أن تتم لبناء منزل هي – بناء الأساس، بناء الأعمدة، بناء الجدران والنوافذ. النقطة المهمة هي أننا لا يمكننا تغيير ترتيب التنفيذ لأننا لا يمكننا بناء النوافذ قبل بناء الأساس. لذلك في هذه الحالة، يمكننا إنشاء أسلوب قالبي سيستخدم أساليب مختلفة لبناء المنزل. الآن بناء الأساس للمنزل هو نفسه لجميع أنواع المنازل، سواء كانت منزلاً خشبيًا أو منزلًا زجاجيًا. لذلك يمكننا توفير تنفيذ قاعدي لهذا، إذا كانت الفصول الفرعية ترغب في تجاوز هذا الأسلوب، يمكنهم ذلك ولكن في الغالب يكون مشتركًا لجميع أنواع المنازل. لضمان عدم تجاوز الفصول الفرعية للأسلوب القالبي، يجب أن نجعله نهائيًا.
فئة النمط القالبي المجردة
منذ أن نريد تنفيذ بعض الطرق عن طريق الفئات الفرعية، يجب أن نجعل فئتنا الأساسية كـ فئة مجردة. HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//طريقة القالب، نهائية حتى لا تتمكن الفئات الفرعية من التجاوز
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//تنفيذ افتراضي
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//الطرق التي يجب تنفيذها بواسطة الفئات الفرعية
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
buildHouse()
هي طريقة القالب وتحدد ترتيب التنفيذ لأداء عدة خطوات.
فئات طريقة القالب الملموسة
يمكننا أن نملك أنواعًا مختلفة من المنازل، مثل منزل الخشب ومنزل الزجاج. WoodenHouse.java
package com.journaldev.design.template;
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
كنا قد قمنا بتجاوز طرق أخرى أيضًا، ولكن لأسباب بساطة لا أفعل ذلك. GlassHouse.java
package com.journaldev.design.template;
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
زبون نمط طريقة القالب
لنقم باختبار مثالنا على نمط طريقة القالب باستخدام برنامج اختبار. HousingClient.java
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//استخدام طريقة القالب
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
ملاحظة أن العميل يستدعي طريقة النموذج للفئة الأساسية ويعتمد على تنفيذ خطوات مختلفة. يتم استخدام بعض الطرق من الفئة الأساسية وبعضها من الفئة الفرعية. إخراج البرنامج أعلاه هو:
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
رسم بياني لفئة طريقة النموذج
نمط تصميم طريقة النموذج في JDK
- جميع الطرق غير الهندسية لـ java.io.InputStream، java.io.OutputStream، java.io.Reader، و java.io.Writer.
- جميع الطرق غير الهندسية لـ java.util.AbstractList، java.util.AbstractSet، و java.util.AbstractMap.
نقاط هامة حول نمط تصميم طريقة النموذج
- يجب أن تتألف طريقة النموذج من خطوات معينة تكون ترتيبها ثابتًا وبالنسبة لبعض الطرق، يختلف التنفيذ من الفئة الأساسية إلى الفئة الفرعية. يجب أن تكون طريقة النموذج نهائية.
- في معظم الأحيان، تقوم الفصائل باستدعاء الطرق من الفئة الأعلى ولكن في نمط القالب، تقوم طريقة القالب في الفئة الأعلى باستدعاء الطرق من الفصائل، وهذا معروف بمبدأ مبدأ هوليوود – “لا تتصل بنا، سنتصل بك.”
- الطرق في الفئة الأساسية مع التنفيذ الافتراضي يشار إليها باسم الخطافات ومن المقصود أن يتم استبدالها من قبل الفصائل، إذا كنت تريد أن تجعل بعض الطرق لا تكون قابلة للاستبدال، يمكنك جعلها نهائية، على سبيل المثال في حالتنا يمكننا جعل طريقة buildFoundation() نهائية لأننا لا نريد للفصائل استبدالها.
هذا كل شيء بالنسبة لنمط تصميم طريقة القالب في جافا، أتمنى أن يكون قد نال إعجابك.
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java