תבנית שיטת התבנית בשפת ג'אווה

שיטת התבנית היא תבנית עיצוב התנהגותית. שיטת עיצוב של התבנית התבנית משמשת ליצירת שקוף של שיטה ולהעברת חלק משלבי היישום לתתי המחלקות.

שיטת עיצוב של התבנית

השיטה התבנית מגדירה את השלבים לביצוע אלגוריתם ויכולה לספק יישום ברירת מחדל שעשוי להיות משותף לכל או חלק מתתי המחלקות. בואו נבין תבנית זו עם דוגמה, נניח שאנחנו רוצים לספק אלגוריתם לבניית בית. השלבים שיש לבצע כדי לבנות בית הם – לבנות יסודות, לבנות עמודים, לבנות קירות וחלונות. הנקודה החשובה היא שאין לנו אפשרות לשנות את סדר הביצוע כי אין לנו אפשרות לבנות חלונות לפני בניית היסודות. לכן, במקרה זה אנחנו יכולים ליצור שיטת תבנית שתשתמש בשיטות שונות כדי לבנות את הבית. כעת, בניית היסודות לבית זהה לכל סוגי הבתים, בין אם זהו בית עץ או בית זכוכית. לכן, אנחנו יכולים לספק יישום בסיסי לכך, אם תתי המחלקות רוצות לדרוס את השיטה הזו, הן יכולות אבל רוב המקרים זהו משותף לכל סוגי הבתים. כדי לוודא שתתי המחלקות לא מדרסות את שיטת התבנית, עלינו לעשות אותה כקבועה.

תבנית מחלקה אבסטרקטית

מכיוון שאנו רוצים שחלק מהשיטות יושם על ידי תתי ירות, עלינו להגדיר את המחלקה הבסיסית שלנו כמחלקה מופשטת. 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.

נקודות חשובות בעיצוב תבנית שיטה

  1. השיטה התבניתית צריכה להכיל מספר שלבים קבוע שלהם ולכמה מהשיטות, המימוש שונה מהמחלקה הבסיסית למחלקה המשנית. שיטת התבנית צריכה להיות סופית.
  2. רוב הפעמים, תת-המחלקות קוראות לשיטות מתוך המחלקה העליונה אך בתבנית תבנית, שיטת התבנית של המחלקה העליונה קוראת לשיטות מתוך תת-המחלקות, זה ידוע כעקרון הוליווד – "אל תתקשרו אלינו, אנחנו נתקשר אליכם".
  3. שיטות במחלקה בסיסית עם מימוש ברירת מחדל מתייחסות כווים והן מיועדות להיות מוחלפות על ידי תת-המחלקות, אם אתה רוצה שחלק מהשיטות לא יוחלפו, אתה יכול להפוך אותם לסופיים, לדוגמה במקרה שלנו אנו יכולים להפוך את השיטה buildFoundation() לסופית מכיוון שאנו לא רוצים שתת-המחלקות יוכלו להחליף אותה.

זה הכל לגבי תבנית התבנית של שיטת תבנית בג'אווה, אני מקווה שאהבתם.

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java