از قدرت روش های انتزاعی و نهایی برای حفظ کنترل پیاده سازی های زیر کلاس استفاده کنید.
الگوی طراحی متد الگو به شما امکان می دهد مراحل یک الگوریتم را در یک متد از یک کلاس تعریف کنید. این به شما اجازه می دهد تا عملیات خاص یک برنامه را به یک روش محدود کنید.
هر مرحله از الگوریتمی که متد قالب تعریف می کند، یک روش درونی است. با این حال، روش قالب تنها اجرای برخی از روشهای درونی خود را انجام میدهد. کلاسهای فرعی معمولاً یک یا چند روش درونی متد الگو را پیادهسازی میکنند.
یک زیر کلاس میتواند یک متد انتزاعی را پیادهسازی کند، اما نمیتواند الگوریتم پیادهسازی شده با روش نهایی را دوباره تعریف کند.
روش الگو چگونه کار می کند
یک الگوی متد الگوی معمولی ساختار زیر را خواهد داشت:
final void templateMethod() {
abstractOperation1();
abstractOperation2();
concreteOperation1();
concreteOperation2();
hook();
}
اولین نکته مهمی که باید به آن توجه کنید این است که templateMethod() نهایی است، بنابراین هیچ زیرکلاسی نمی تواند این متد را لغو کند. نکته مهم دیگری که باید به آن توجه کرد، سه نوع روشی است که الگوی متد الگو از آنها استفاده می کند: بتن، انتزاعی و قلاب.
کلاس انتزاعی که متد template را در خود جای داده است، تمام روشهای مشخص آن را پیادهسازی میکند، در حالی که زیر کلاسهای بتن متدهای انتزاعی آن را پیادهسازی میکنند. متد hook معمولاً بهطور پیشفرض هیچ کاری انجام نمیدهد، اما یک کلاس فرعی این توانایی را دارد که در صورت لزوم این روشها را لغو کند.
پیاده سازی الگوی روش الگو در جاوا
الگوی متد الگو به عنوان چارچوبی برای یک برنامه کاربردی عمل می کند. بنابراین، شما اغلب این الگو را در چارچوبهای نرمافزاری میبینید که طرح اولیه توسعه برنامه را ارائه میکنند.
به عنوان مثال، شما می توانید برنامه خود را به یکی از بسیاری از سیستم های پایگاه داده متصل کنید. مراحل اتصال به پایگاه داده و استفاده از آن از یک الگوی مشابه پیروی می کند:
public abstract class Database {
// template method
final void databaseTemplate() {
// abstract methods
setDBDriver();
setCredentials();
// concrete method
connect();
// abstract methods
createDB();
setData();
readData();
// hook methods
if (userWantsToUpdate()) {
updateData();
}
if (userWantsToDelete()) {
deleteData();
}
// concrete method
closeConnection();
}
abstract void setDBDriver();
abstract void setCredentials();
abstract void createDB();
abstract void setData();
abstract void readData();
abstract void updateData();
abstract void deleteData();
void connect() {
System.out.println("Connecting to database...");
}
void closeConnection() {
System.out.println("Destroying database connection...");
}
boolean userWantsToUpdate() {
return false;
}
boolean userWantsToDelete() {
return false;
}
}
این مثال کلاس Database از الگوی متد قالب برای ایجاد قالبی استفاده می کند که می توانید با هر پایگاه داده استفاده کنید. برای استفاده از پایگاه داده، برنامه شما باید به آن متصل شود، سپس پس از استفاده، اتصال را از بین ببرد. این فعالیت ها معمولا برای همه پایگاه های داده یکسان هستند. بنابراین، کلاس Database انتزاعی می تواند متدهای connect() و closeConnection() را پیاده سازی کند.
روش های دیگر در روش قالب بر اساس نوع پایگاه داده متفاوت خواهد بود. به عنوان مثال، پایگاه داده MySQL داده ها را در جداول ذخیره می کند، در حالی که پایگاه داده MongoDB داده ها را در مجموعه ها ذخیره می کند. اگر می خواهید از پایگاه داده MySQL در جاوا استفاده کنید، به سادگی یک کلاس MySQL جدید ایجاد کنید که کلاس Database را گسترش می دهد:
public class MySQL extends Database {
@Override
void setDBDriver() {
System.out.println("Selecting MySQL driver...");
}
@Override
void setCredentials() {
System.out.println("Setting MySQL database Credential...");
}
@Override
void createDB() {
System.out.println("Creating a new table...");
}
@Override
void setData() {
System.out.println("Inserting data into database...");
}
@Override
void readData() {
System.out.println("Retrieving data from database...");
}
@Override
void updateData() {
System.out.println("Updating data in database...");
}
@Override
void deleteData() {
System.out.println("Deleting data from database...");
}
}
کلاس MySQL تمام متدهای انتزاعی کلاس Database را پیاده سازی می کند. همچنین می تواند برخی از روش های مشخص را نادیده بگیرد. با این حال، نمی تواند متد databaseTemplate() را که از کلمه کلیدی نهایی استفاده می کند، لمس کند.
public class Main {
public static void main(String[] args) {
Database mySQLDB = new MySQL();
mySQLDB.databaseTemplate();
}
}
این کلاس Main یک شی پایگاه داده MySQL جدید ایجاد می کند و از روش template برای شبیه سازی نحوه اتصال یک برنامه کاربردی به پایگاه داده استفاده می کند. اجرای روش اصلی خروجی زیر را در کنسول چاپ می کند:
در خروجی، متوجه خواهید شد که برنامه هرگز متدهای updateData() و deleteData() را فراخوانی نمی کند. به همین دلیل است که روش های قلاب مهم هستند. در یک پایگاه داده SQL، می خواهید جداول جدید ایجاد کنید، داده ها را وارد کنید و داده های خود را مشاهده کنید. با این حال، ممکن است نخواهید دادهها را بهروزرسانی یا حذف کنید. بنابراین، روشهای هوک به زیر کلاسها این امکان را میدهند که این جنبههای حیاتی الگوریتم را کنترل کنند.
@Override
boolean userWantsToUpdate() {
return true;
}
به سادگی با افزودن کد بالا به کلاس MySQL، برنامه اکنون داده های موجود در پایگاه داده را به روز می کند. اگر دوباره کلاس Main را اجرا کنید، خروجی به روز شده زیر را نمایش می دهد:
همانطور که می بینید، برنامه اکنون داده ها را در پایگاه داده به روز می کند.
مزایای استفاده از الگوی طراحی روش الگو
یکی از مزایای اصلی الگوی روش الگو این است که قابلیت استفاده مجدد نرم افزار را ارتقا می دهد. این الگوی طراحی از برنامه نویسی کارآمد نیز پشتیبانی می کند. یک زیر کلاس فقط نیاز به پیاده سازی متدهایی دارد که مختص عملکرد آن هستند.
علاوه بر این، برنامهای که از الگوی متد الگو استفاده میکند، امنتر است، زیرا کلاسهای خارجی نمیتوانند ساختار عملیاتی آن را تغییر دهند.