نمط تصميم المحول في جافا

نمط تصميم المحول هو أحد أنماط التصميم الهيكلي ويستخدم حتى يمكن لواجهتين غير ذات صلة أن تعملا سويًا. الكائن الذي يربط هاتين الواجهتين غير المتصلتين يسمى محول.

نمط تصميم المحول

أحد الأمثلة الحقيقية الرائعة لنمط تصميم المحول هو شاحن الهاتف المحمول. تحتاج بطارية الهاتف المحمول إلى 3 فولت للشحن ولكن المقبس العادي ينتج إما 120 فولت (الولايات المتحدة) أو 240 فولت (الهند). لذا يعمل شاحن الهاتف المحمول كمحول بين مقبس شحن الهاتف المحمول ومقبس الحائط. سنحاول تنفيذ محول متعدد باستخدام نمط تصميم المحول في هذا البرنامج التعليمي. لذلك سنقوم في البداية بإنشاء فئتين – Volt (لقياس الفولت) و Socket (ينتج فولتًا ثابتًا قدره 120 فولت).

package com.journaldev.design.adapter;

public class Volt {

	private int volts;
	
	public Volt(int v){
		this.volts=v;
	}

	public int getVolts() {
		return volts;
	}

	public void setVolts(int volts) {
		this.volts = volts;
	}
	
}
package com.journaldev.design.adapter;

public class Socket {

	public Volt getVolt(){
		return new Volt(120);
	}
}

الآن نريد بناء محول يمكنه إنتاج 3 فولت و 12 فولت و 120 فولت الافتراضي. لذلك سنقوم في البداية بإنشاء واجهة محول بهذه الطرق.

package com.journaldev.design.adapter;

public interface SocketAdapter {

	public Volt get120Volt();
		
	public Volt get12Volt();
	
	public Volt get3Volt();
}

نمط تصميم محول ذو اتجاهين

أثناء تنفيذ نمط المحول، هناك نهجان – محول الصف ومحول الكائن – ومع ذلك، كلا هذه النهجين ينتجان نفس النتيجة.

  1. محول الصف – يستخدم هذا الشكل توريث جافا ويوسع واجهة المصدر، في حالتنا فئة Socket.
  2. محول الكائن – يستخدم هذا الشكل التكوين بجافا ويحتوي المحول على الكائن المصدر.

نمط تصميم المحول – محول الصف

هذا هو تنفيذ نهج محول الصف لمحولنا.

package com.journaldev.design.adapter;

//استخدام التوريث لنمط المحول 
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{

	@Override
	public Volt get120Volt() {
		return getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}

}

نمط تصميم المحول – تنفيذ محول الكائن

هذا هو تنفيذ نهج محول الكائن لمحولنا.

package com.journaldev.design.adapter;

public class SocketObjectAdapterImpl implements SocketAdapter{

	//استخدام التكوين لنمط المحول
	private Socket sock = new Socket();
	
	@Override
	public Volt get120Volt() {
		return sock.getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}
}

نلاحظ أن تنفيذات المحولين متشابهة تقريبًا وتنفذ واجهة SocketAdapter. يمكن أيضًا أن تكون واجهة المحول فئة مجردة. فيما يلي برنامج اختبار لاستهلاك تنفيذ نمط تصميم المحول الخاص بنا.

package com.journaldev.design.test;

import com.journaldev.design.adapter.SocketAdapter;
import com.journaldev.design.adapter.SocketClassAdapterImpl;
import com.journaldev.design.adapter.SocketObjectAdapterImpl;
import com.journaldev.design.adapter.Volt;

public class AdapterPatternTest {

	public static void main(String[] args) {
		
		testClassAdapter();
		testObjectAdapter();
	}

	private static void testObjectAdapter() {
		SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Object Adapter="+v3.getVolts());
		System.out.println("v12 volts using Object Adapter="+v12.getVolts());
		System.out.println("v120 volts using Object Adapter="+v120.getVolts());
	}

	private static void testClassAdapter() {
		SocketAdapter sockAdapter = new SocketClassAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Class Adapter="+v3.getVolts());
		System.out.println("v12 volts using Class Adapter="+v12.getVolts());
		System.out.println("v120 volts using Class Adapter="+v120.getVolts());
	}
	
	private static Volt getVolt(SocketAdapter sockAdapter, int i) {
		switch (i){
		case 3: return sockAdapter.get3Volt();
		case 12: return sockAdapter.get12Volt();
		case 120: return sockAdapter.get120Volt();
		default: return sockAdapter.get120Volt();
		}
	}
}

عند تشغيل البرنامج الاختباري أعلاه ، نحصل على الناتج التالي.

v3 volts using Class Adapter=3
v12 volts using Class Adapter=12
v120 volts using Class Adapter=120
v3 volts using Object Adapter=3
v12 volts using Object Adapter=12
v120 volts using Object Adapter=120

رسم بياني لفئة نمط تصميم المحول

مثال على نمط تصميم المحول في JDK

بعض أمثلة نمط تصميم المحول التي يمكن العثور عليها بسهولة في فئات JDK هي؛

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream) (تُرجع Reader)
  • java.io.OutputStreamWriter(OutputStream) (تُرجع Writer)

هذا كل شيء بخصوص نمط تصميم المحول في جافا.

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