در این قسمت تیم کدگیت را با آموزش Template پترن در جاوا همراهی کنید. در ابتدای این آموزش به معرفی Template پترن پرداخته و در ادامه دو کلاس که از این نوع پترن استفاده کردهاند را معرفی خواهیم کرد. در آخر یک مثال واقعی با استفاده از Template پترن پیاده سازی خواهیم کرد. همچنین پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را مطالعه کنید:
- شی گرایی در جاوا
- متد در جاوا
- Constructor در جاوا
- Abstract در جاوا
- ارث بری در جاوا
- Overriding در جاوا
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
Template Pattern
Template پترن وقتی که یک نوع ساختار کلی برای فرآیند وجود دارد، استفاده میشود. در این پترن یک کلاس (منظور کلاس Abstract است) قدمهای و ساختار فرآیند را تعریف و بقیه زیرکلاسها (Subclass) با Override کردن میتوانند پیاده سازی فرآیند را داشته باشند.
برای درک بهتر میتوان به یک مثال واقعی از این پترن را اشاره کرد. فرض کنید میخواهیم یک خانهای را بسازیم. فرآیند و قدمهای ساخت یک خانه تقریبا مشخص است ابتدا ساختار کلی خانه سپس ستونها و پنجره ها و …. . دقت شود ما نمیتوانیم ابتدا پنجره ها را بسازیم سپس ساختار کلی یک خانه را مشخص کنیم.
با دانستن مراحل و قدمهای ساخت یک منزل دیگر مهم نیست خانهای که ساخته میشود چوبی یا خانهای شیشهای باشد! با تعریف قدمها یا ساختار کلی در Template پترن میتوان از پیاده سازیها مختلفی استفاده کرد. می توان این ویژگی را یکی از قواید این پترن دانست.
مثال Template پترن در جاوا
در قسمت قبل یک مثال از Template پترن زده شد در این قسمت همان مثال را پیاده سازی میکنیم. همانطور که گفته شد ما در این پترن یک ساختار کلی را معرفی میکنیم. این ساختار کلی با کمک کلاس Abstract تعریف میشود. در این مثال کلاسی به نام HouseTemplate که ساختار کلی یک خانه را در آن تعریف کردیم. دو کلاس GlassHouse و WoodHouse نیز برای پیاده سازی قدمها در فرآیند ساخت خانه میباشد. در تصویر بالا دیاگرام کلاس این مثال را میبینید. کد این مثال به صورت زیر میباشد.
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");
}
}
public abstract class HouseTemplate {
// template method, final so subclasses can't override
public final void buildHouse() {
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
// default implementation
private void buildWindows() {
System.out.println("Building Glass Windows");
}
// methods to be implemented by subclasses
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out
.println("Building foundation with cement,iron rods and sand");
}
}
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");
}
}
تست مثال Template پترن در جاوا
برای تست کدهای بالا، کد Main زیر را بزنید:
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
// using template method
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.