نمط تصميم الواجهة في جافا

نمط تصميم الواجهة هو واحد من أنماط تصميم الهيكل (مثل نمط المحول و نمط الزخرفة). يُستخدم نمط تصميم الواجهة لمساعدة تطبيقات العميل على التفاعل بسهولة مع النظام.

نمط تصميم الواجهة

وفقًا لكتاب GoF، يتمثل نمط تصميم الواجهة في:

توفير واجهة موحدة لمجموعة من الواجهات في نظام فرعي. يعرف نمط الواجهة واجهة على مستوى أعلى تجعل النظام الفرعي أسهل في الاستخدام.

فلنفترض أن لدينا تطبيق يحتوي على مجموعة من الواجهات لاستخدام قواعد بيانات MySql/Oracle وإنشاء تقارير مختلفة، مثل تقرير HTML، تقرير PDF، إلخ. لذلك سنكون لدينا مجموعة مختلفة من الواجهات للتعامل مع أنواع مختلفة من قواعد البيانات. الآن يمكن لتطبيق العميل استخدام هذه الواجهات للحصول على الاتصال بقاعدة البيانات المطلوبة وإنشاء التقارير. ولكن عندما يزداد التعقيد أو تكون أسماء سلوك الواجهات غير واضحة، سيجد تطبيق العميل صعوبة في إدارتها. لذا يمكننا تطبيق نمط تصميم الـ “Facade” هنا وتوفير واجهة التجميع أعلى الواجهة الحالية لمساعدة تطبيق العميل.

نمط تصميم الـ “Facade” – مجموعة من الواجهات

يمكننا أيضًا أن نملك واجهتين مساعدتين، هما MySqlHelper و OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//الحصول على اتصال قاعدة البيانات MySql باستخدام معلمات الاتصال
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//الحصول على البيانات من الجدول وإنشاء تقرير PDF
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//الحصول على البيانات من الجدول وإنشاء تقرير PDF
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//الحصول على اتصال قاعدة البيانات Oracle باستخدام معلمات الاتصال
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//الحصول على البيانات من الجدول وإنشاء تقرير PDF
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//الحصول على البيانات من الجدول وإنشاء تقرير PDF
	}
	
}

واجهة نمط التصميم الواجهي

يمكننا إنشاء واجهة نمط الواجهة كما في الأسفل. لاحظ استخدام تعداد جافا لضمان الأمان في النوع.

package com.journaldev.design.facade;

import java.sql.Connection;

public class HelperFacade {

	public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
		Connection con = null;
		switch (dbType){
		case MYSQL: 
			con = MySqlHelper.getMySqlDBConnection();
			MySqlHelper mySqlHelper = new MySqlHelper();
			switch(reportType){
			case HTML:
				mySqlHelper.generateMySqlHTMLReport(tableName, con);
				break;
			case PDF:
				mySqlHelper.generateMySqlPDFReport(tableName, con);
				break;
			}
			break;
		case ORACLE: 
			con = OracleHelper.getOracleDBConnection();
			OracleHelper oracleHelper = new OracleHelper();
			switch(reportType){
			case HTML:
				oracleHelper.generateOracleHTMLReport(tableName, con);
				break;
			case PDF:
				oracleHelper.generateOraclePDFReport(tableName, con);
				break;
			}
			break;
		}
		
	}
	
	public static enum DBTypes{
		MYSQL,ORACLE;
	}
	
	public static enum ReportTypes{
		HTML,PDF;
	}
}

برنامج عميل نمط التصميم الواجهي

الآن دعنا نرى كود العميل بدون استخدام نمط الواجهة وباستخدام واجهة نمط الواجهة.

package com.journaldev.design.test;

import java.sql.Connection;

import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;

public class FacadePatternTest {

	public static void main(String[] args) {
		String tableName="Employee";
		
		// إنشاء تقرير HTML لقاعدة بيانات MySql وتقرير PDF لقاعدة بيانات Oracle دون استخدام الواجهة
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		// إنشاء تقرير HTML لقاعدة بيانات MySql وتقرير PDF لقاعدة بيانات Oracle باستخدام الواجهة
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

كما يمكنك أن ترى، استخدام واجهة نمط الواجهة هو طريقة أسهل وأنظف بكثير لتجنب وجود الكثير من المنطق في جانب العميل. فصل فئة إدارة محرك JDBC للحصول على اتصال قاعدة البيانات هو مثال رائع على نمط تصميم الواجهة.

نقاط مهمة في نمط التصميم الواجهي

  • نمط تصميم الواجهة (Facade) هو أكثر تشبثاً بدوالاً لتطبيقات العميل، لا يخفي واجهات النظام الفرعية عن العميل. قرار استخدام الواجهة يعتمد تمامًا على الشفرة العميلة.
  • يمكن تطبيق نمط تصميم الواجهة في أي مرحلة من التطوير، عادةً عندما يزداد عدد الواجهات ويصبح النظام أكثر تعقيدًا.
  • واجهات النظام الفرعية ليست على علم بالواجهة ولا ينبغي أن تحتوي على أي مرجع لواجهة الواجهة.
  • يجب تطبيق نمط تصميم الواجهة لواجهات مماثلة، حيث يهدف إلى توفير واجهة واحدة بدلاً من واجهات متعددة تقوم بنفس الوظيفة.
  • يمكننا استخدام نمط الـ(Factory) مع الواجهة لتوفير واجهة أفضل لأنظمة العميل.

هذا كل شيء بخصوص نمط تصميم الواجهة، ترقب المزيد من مقالات نمط التصميم. 🙂

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