مرجع
آخر الزيارات

نمط المحول

2٬308 كلمة•0 مشاهدة•🗒️ منذ يوم
باختصار: في هندسة البرمجيات، نمط المحوّل هو نمط تصميم برمجيات (يُعرف كذلك باسم المغلّف؛ تسمية بديلة مشتركة مع نمط الديكور) يسمح لواجهة صنف موجود مسبقاً ليُستعمل كواجهة أخرى. تجد هنا «def use_micro_usb»، «AdapterFactory.getInstance» و«نمط محوّل الكائن» ضمن 74 قسماً.
المحتويات
  1. def use_micro_usb
  2. AdapterFactory.getInstance
  3. نمط محوّل الكائن
  4. public class AdapterDemo {
  5. نمط محوّل الصنف
  6. سكالا
  7. RECHARGE = ["Recharge started.", "Recharge finished."]
  8. self.phone.recharge
  9. WriteLn('Recharging iPhone with MicroUsb');
  10. type
  11. @connector = true
  12. puts
  13. private final LightningPhone lightningPhone;
  14. {
  15. end;
  16. بايثون
  17. {
  18. System.out.println("Recharging iPhone with MicroUsb");
  19. phone = Iphone.new
  20. AdapterFactory.getInstance
  21. .getStringData);
  22. self.phone = IPhone
  23. }
  24. الدافع من الحل وقت التجميع
  25. print
  26. {
  27. self.connector = True
  28. self.connector = True
  29. @abstractmethod
  30. type
  31. self.phone.recharge
  32. self.mobile = mobile
  33. else
  34. }
  35. public
  36. }
  37. from abc import ABCMeta, abstractmethod
  38. self.mobile.use_lightning
  39. classC.setImage(provider.getImage);
  40. حل محوّل وقت التشغيل
  41. private $mobile;
  42. private getter mobile : FormatIphone
  43. if @connector
  44. self.mobile.recharge
  45. مخطط الصنف بلغة النمذجة الموحدة
  46. else
  47. تنفيذ نمط المحوّل
  48. @connector = true
  49. تعريف
  50. end;
  51. @abstractmethod
  52. end;
  53. private String format(final String sourceValue) {
  54. ملحق: مسرد المصطلحات الإنجليزية
  55. self.phone_adapter.recharge
  56. self.connector = False
  57. print
  58. String string = provider.getStringData;
  59. puts
  60. }
  61. end
  62. {
  63. override def clientMethod: Unit = {
  64. type
  65. }
  66. self.connector = False
  67. AdapterFactory.getInstance
  68. @abstractmethod
  69. AdapterFactory.getInstance
  70. end;
  71. if @connector
  72. }
  73. نظرة عامة
  74. استخدام

على سبيل التعريف، في هندسة البرمجيات، نمط المحوّل هو نمط تصميم برمجيات (يُعرف كذلك باسم المغلّف؛ تسمية بديلة مشتركة مع نمط الديكور) يسمح لواجهة صنف موجود مسبقاً ليُستعمل كواجهة أخرى. غالبًا ما يتم استخدامه لجعل الأصناف الموجودة تعمل مع الآخرين دون تعديل الكود المصدري الخاص بهم. ونتناول فيما يلي مزيدًا من التفاصيل.

إضافةً إلى ذلك، مثال على ذلك هو المحوّل الذي يحوّل واجهة نموذج كائن المستند من مستند XML إلى بنية شجرة يمكن عرضها.

def use_micro_usb

  • puts "MicroUsb connected"
  • @mobile.use_lightning
  • end
  • end
  • class AndroidRecharger
  • def initialize
  • phone = Android.new
  • phone.use_micro_usb
  • phone.recharge
  • end
  • end
  • class IphoneMicroUsbRecharger
  • def initialize

AdapterFactory.getInstance

Adapter adapter

من جانب آخر، 6. وإذا كان من المطلوب إخراج البيانات من صنف ، مثلًا؛ بيانات لصورة في :

كذلك، .getAdapterFromTo(ClassA.class, StringProvider.class, "تنسيق2");

نمط محوّل الكائن

من جانب آخر، نمط محوّل الكائن في نمط المحوّل هذا، يحتوي المحوّل على مثيل من الصنف الذي يغلّفه. في هذه الحالة، يقوم المحوّل بإجراء استدعاءات إلى مثيل الكائن المُغلّف.

public class AdapterDemo {

  • static void rechargeMicroUsbPhone(MicroUsbPhone phone) {
  • phone.useMicroUsb;
  • phone.recharge;

نمط محوّل الصنف

شكل آخر من أنماط محوّل وقت التشغيل

ومن جهة أخرى، نمط محوّل الصنف يستعمل نمط المحوّل هذا عدة واجهات متعددة الأشكال تقوم بتنفيذ أو توريث كل من الواجهة المتوقعة والواجهة الموجودة مسبقًا. من المعتاد أن تكون الواجهة المتوقعة مُنشئة كصنف واجهة خالصة (صافية)، خاصة في لغات مثل جافا (قبل JDK 1.8) التي لا تدعم توارث الأصناف المتعدد.

سكالا

implicit def adaptee2Adapter(adaptee: Adaptee): Adapter = {

new Adapter {

RECHARGE = ["Recharge started.", "Recharge finished."]

  • POWER_ADAPTERS = {"Android": "MicroUSB", "iPhone": "Lightning"}
  • CONNECTED = "{} connected."
  • CONNECT_FIRST = "Connect {} first."
  • class RechargeTemplate:
  • __metaclass__ = ABCMeta

self.phone.recharge

AndroidRecharger

print("Recharging Android with MicroUSB recharger.")

WriteLn('Recharging iPhone with MicroUsb');

وعلى صعيد آخر، _LightningToMicroUsbAdapter := TLightningToMicroUsbAdapter.Create(_IPhone);

RechargeMicroUSBPhone(_LightningToMicroUsbAdapter);

type

  • TLightningToMicroUsbAdapter = class(TInterfacedObject, IMicroUSBPhone)
  • strict private
  • FLightningPhone: ILightningPhone;

@connector = true

  • puts "Lightning connected"
  • end
  • def recharge

puts

  • puts "Recharging iPhone with iPhone Recharger"
  • IphoneRecharger.new المخرجات:
  • Recharging android with MicroUsb Recharger
  • MicroUsb connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with MicroUsb using Adapter pattern
  • MicroUsb connected
  • Lightning connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with iPhone Recharger
  • Lightning connected
  • Recharge started
  • Recharge finished
  • جافا
  • interface LightningPhone {
  • void recharge;
  • void useLightning;
  • }
  • interface MicroUsbPhone {
  • void recharge;
  • void useMicroUsb;
  • }
  • class Iphone implements LightningPhone {
  • private boolean connector;
  • @Override
  • public void useLightning {
  • connector = true;
  • System.out.println("Lightning connected");
  • }
  • @Override
  • public void recharge {
  • if (connector) {
  • System.out.println("Recharge started");
  • System.out.println("Recharge finished");
  • } else {
  • System.out.println("Connect Lightning first");
  • }
  • }
  • }
  • class Android implements MicroUsbPhone {
  • private boolean connector;
  • @Override
  • public void useMicroUsb {
  • connector = true;
  • System.out.println("MicroUsb connected");
  • }
  • @Override
  • public void recharge {
  • if (connector) {
  • System.out.println("Recharge started");
  • System.out.println("Recharge finished");
  • } else {
  • System.out.println("Connect MicroUsb first");
  • }
  • }

private final LightningPhone lightningPhone;

  • public LightningToMicroUsbAdapter (LightningPhone lightningPhone) {
  • this.lightningPhone = lightningPhone;
  • }
  • @Override
  • public void useMicroUsb {
  • System.out.println("MicroUsb connected");
  • lightningPhone.useLightning;
  • }
  • @Override
  • public void recharge {
  • lightningPhone.recharge;
  • }
  • }

{

  • echo "---Recharging Android Phone with Generic Recharger---\n";
  • $this->phone = new Android;
  • $this->phone->useMicroUsb;
  • $this->phone->recharge;
  • echo "---Phone Ready for use---\n\n";
  • }
  • }
  • $androidRecharger = new AndroidRecharger;
  • // Result: #quanton81
  • //---Recharging iPhone with Generic Recharger---
  • //MicroUsb connected -> Lightning connected -$
  • //Recharge Started
  • //Recharge 20%
  • //Recharge 50%
  • //Recharge 70%
  • //Recharge Finished
  • //---iPhone Ready for use---
  • //
  • //---Recharging iPhone with iPhone Recharger---
  • //Lightning connected -$
  • //Recharge Started
  • //Recharge 20%
  • //Recharge 50%
  • //Recharge 70%
  • //Recharge Finished
  • //---iPhone Ready for use---
  • //
  • //---Recharging Android Phone with Generic Recharger---
  • //MicroUsb connected ->
  • //Recharge Started
  • //Recharge 20%
  • //Recharge 50%
  • //Recharge 70%
  • //Recharge Finished
  • //---Phone Ready for use---

end;

  • procedure TEdijsForm.PatternExampleButtonClick(Sender: TObject);
  • var
  • _Android: IMicroUSBPhone;
  • _IPhone: ILightningPhone;
  • _LightningToMicroUsbAdapter: IMicroUSBPhone;
  • begin
  • _Android := TAndroid.Create;
  • WriteLn('Recharging android with MicroUsb');
  • RechargeMicroUSBPhone(_Android);
  • _IPhone := TIPhone.Create;
  • WriteLn('Recharging iPhone with Lightning');
  • RechargeLightningPhone(_IPhone);

بايثون

  • """
  • Adapter pattern example.
  • """

{

  • if ($this->connectorOk)
  • {
  • echo "Recharge Started\n";
  • echo "Recharge 20%\n";
  • echo "Recharge 50%\n";
  • echo "Recharge 70%\n";
  • echo "Recharge Finished\n";
  • }
  • else
  • {
  • echo "Connect Lightning first\n";
  • }
  • }
  • }
  • // Adapter
  • class IPhoneAdapter implements IFormatAndroid
  • {

System.out.println("Recharging iPhone with MicroUsb");

ومن جهة أخرى، rechargeMicroUsbPhone(new LightningToMicroUsbAdapter (iPhone));

phone = Iphone.new

  • phone_adapter = IphoneAdapter.new(phone)
  • phone_adapter.use_micro_usb
  • phone_adapter.recharge
  • end
  • end
  • class IphoneRecharger
  • def initialize
  • phone = Iphone.new
  • phone.use_lightning
  • phone.recharge
  • end

AdapterFactory.getInstance

ومن ناحية أخرى، .getAdapterFromTo(ClassA.class, StringProvider.class, "تنسيق1")

.adapt(classA))

.getStringData);

من جانب آخر، 5. يمكن ملاحظة الفائدة من ذلك، إذا كان من المطلوب نقل البيانات بتنسيق ثاني، فابحثْ عن المحوّل/ المزود المختلف:

Adapter adapter

self.phone = IPhone

self.phone_adapter.use_micro_usb

self.phone_adapter = IPhoneAdapter(self.phone)

}

  • }مخرجات:
  • Recharging android with MicroUsb
  • MicroUsb connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with Lightning
  • Lightning connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with MicroUsb
  • MicroUsb connected
  • Lightning connected
  • Recharge started
  • Recharge finished
  • دلفي
  • type
  • ILightningPhone = interface
  • ['{52628045-CF6C-41F0-ACCA-A65DCEE13BDC}']
  • procedure Recharge;
  • procedure UseLightning;
  • end;
  • type
  • IMicroUSBPhone = interface
  • ['{436746B6-D02D-49E6-A5AC-F6D745DFD182}']
  • procedure Recharge;
  • procedure UseMicroUSB;
  • end;

الدافع من الحل وقت التجميع

إضافةً إلى ذلك، classB.setStringData(classA.getStringData); ومع ذلك، افترض أنه يجب تغيير تنسيق بيانات السلاسل النصية في . الحل وقت التجميع هو استخدام الوراثة:

  • public class Format1ClassA extends ClassA {
  • @Override
  • public String getStringData {
  • return format(toString);

ومن جهة أخرى، يجب أن يدعم صنف صنف مع بعض البيانات، لنفترض وجود بعض البيانات من سلاسل النص. الحل وقت التجميع هو التالي:

print

print("Recharging iPhone with iPhone recharger.")

IPhoneRecharger

{

  • if ($this->connectorOk)
  • {
  • echo "Recharge Started\n";
  • echo "Recharge 20%\n";
  • echo "Recharge 50%\n";
  • echo "Recharge 70%\n";
  • echo "Recharge Finished\n";
  • }
  • else
  • {
  • echo "Connect MicroUsb first\n";
  • }
  • }
  • }
  • // client
  • class MicroUsbRecharger
  • {
  • private $phone;
  • private $phoneAdapter;
  • public function __construct

self.connector = True

  • print(CONNECTED.format(POWER_ADAPTERS[self.__name__]))
  • def recharge(self):
  • if self.connector:
  • for state in RECHARGE:
  • print(state)
  • else:
  • print(CONNECT_FIRST.format(POWER_ADAPTERS[self.__name__]))
  • class IPhoneAdapter(FormatAndroid):
  • def __init__(self, mobile):

self.connector = True

  • print(CONNECTED.format(POWER_ADAPTERS[self.__name__]))
  • def recharge(self):
  • if self.connector:
  • for state in RECHARGE:
  • print(state)
  • else:
  • print(CONNECT_FIRST.format(POWER_ADAPTERS[self.__name__]))
  • class Android(FormatAndroid):
  • __name__ = "Android"
  • def __init__(self):

@abstractmethod

  • def recharge(self):
  • raise NotImplementedError(NOT_IMPLEMENTED)
  • class FormatIPhone(RechargeTemplate):

type

  • TIPhone = class(TInterfacedObject, ILightningPhone)
  • strict private
  • FConnector: Boolean;
  • public
  • procedure Recharge;
  • procedure UseLightning;
  • end;

self.phone.recharge

class IPhoneMicroUSBRecharger(object):

def __init__(self):

self.mobile = mobile

def recharge(self):

else

  • puts "Connect Lightning first"
  • Close
  • end
  • end
  • class Android < FormatAndroid
  • def initialize
  • @connector = false
  • end
  • def use_micro_usb

}

من جانب آخر، /* exposing the target interface while wrapping source object */

class LightningToMicroUsbAdapter implements MicroUsbPhone {

public

  • constructor Create(const ALightningPhone: ILightningPhone); reintroduce;
  • procedure Recharge;
  • procedure UseMicroUSB;

}

إضافةً إلى ذلك، 3. سجّلْ المحوّل في سجل عالمي، بحيث يمكن البحث عن المحوّل في وقت التشغيل:

وفي هذا الصدد، 4. في الكود، عند الرغبة في نقل البيانات من صنف إلى صنف ، اكتبْ:

Adapter adapter

ومن ناحية أخرى، AdapterFactory.getInstance.registerAdapter(ClassA.class, ClassAFormat1Adapter.class, "تنسيق1");

from abc import ABCMeta, abstractmethod

NOT_IMPLEMENTED = "You should implement this."

self.mobile.use_lightning

  • class AndroidRecharger(object):
  • def __init__(self):
  • self.phone = Android
  • self.phone.use_micro_usb

classC.setImage(provider.getImage);

ومن جهة أخرى، 7. بهذه الطريقة، استخدام المحوّلات والمزودين يسمح بتعدد «الرؤية» من قبل صنفا و في صنف دون الحاجة إلى تغيير التسلسل الهرمي للأصناف. بشكل عام، ما سبق يسمح بآلية لتدفق البيانات الغير محددة بين الكائنات التي يمكن تعديلها إلى التسلسل الهرمي للكائن الموجود.

حل محوّل وقت التشغيل

باستخدام «المحوّلات» نحصل على الحل كما يلي:

وفي السياق ذاته، 1. عرّف واجهة «مزود» وسيط، واكتبْ تنفيذ لواجهة المزود تلك التي تغلف مصدر البيانات، في هذا المثال، وتخرج البيانات المنسقة حسب الضرورة:

  • public interface StringProvider {
  • public String getStringData;
  • }
  • public class ClassAFormat1 implements StringProvider {
  • private ClassA classA = null;
  • public ClassAFormat1(final ClassA a) {
  • classA = a;
  • }
  • public String getStringData {
  • return format(classA.getStringData);
  • }

private $mobile;

  • public function __construct(IFormatIPhone $mobile)
  • {
  • $this->mobile = $mobile;
  • }
  • public function recharge
  • {
  • $this->mobile->recharge;
  • }
  • public function useMicroUsb
  • {
  • echo "MicroUsb connected -> ";
  • $this->mobile->useLightning;
  • }
  • }
  • class Android implements IFormatAndroid
  • {
  • private $connectorOk = FALSE;
  • public function useMicroUsb
  • {
  • $this->connectorOk = TRUE;
  • echo "MicroUsb connected ->\n";
  • }
  • public function recharge

private getter mobile : FormatIphone

  • def initialize(@mobile)
  • end
  • def recharge
  • @mobile.recharge
  • end

if @connector

puts "Recharge started"

puts "Recharge finished"

self.mobile.recharge

print(CONNECTED.format(POWER_ADAPTERS["Android"]))

def use_micro_usb(self):

مخطط الصنف بلغة النمذجة الموحدة

وفي هذا السياق، أسلوب مُحوّل الصنف ينفذ الواجهة الهدف من خلال الوراثة من صنف المحَوَل في وقت التجميع (الكود: عملية محددة).

وفي هذا الصدد، في مخطط الصنف بلغة النمذجة الموحدة أعلاه، لا يمكن لصنف العميل الذي يتطلب الواجهة الهدف إعادة استخدام صنف المحَوَل مباشرة لأن المحوَل لا يتوافق مع الواجهة الهدف . بدلاً من ذلك، يقوم العميل خلال صنف المحوّل بتنفيذ الواجهة الهدف من حيث المحوَل :

كذلك، أسلوب مُحوّل الكائن ينفذ الواجهة الهدف عن طريق التفويض إلى كائن محَوَل في وقت التشغيل (الكود: محَوَل.عملية محددة).

else

  • puts "Connect MicroUsb first"
  • end
  • end
  • end
  • class IphoneAdapter < FormatAndroid

تنفيذ نمط المحوّل

  • كريستال
  • abstract class FormatIphone
  • getter connector
  • abstract def recharge
  • abstract def use_lightning
  • end
  • abstract class FormatAndroid
  • getter connector
  • abstract def recharge
  • abstract def use_micro_usb
  • end
  • class Iphone < FormatIphone
  • def initialize
  • @connector = false
  • end
  • def use_lightning

وفي هذا الصدد، عند تنفيذ نمط المحوّل، للتوضيح، يمكن للمرء تطبيق اسم الصنف من صنف إلى واجهة محوّل كالتالي للتنفيذ الخاص بالمزود، مثلًا . يجب أن يكون لديه طريقة المنشئ مع متغير خاص بصنف المحَوَل كمعلمة. سيتم تمرير هذه المعلمة إلى مثيل عضو من (اسم-الصنف) إلى (اسم-الواجهة) للمحوّل كالتالي . عندما يتم استدعاء طريقة العميل، سيتمكن من الوصول إلى مثيل المحوَل الذي يسمح بالوصول إلى البيانات المطلوبة للمحوَل وتنفيذ العمليات على تلك البيانات التي تولد المخرجات المطلوبة.

@connector = true

  • puts "MicroUsb connected"
  • end
  • def recharge

تعريف

وعلى صعيد آخر، يسمح المحوّل لواجهتين غير متوافقتين بالعمل معًا. هذا هو التعريف الحقيقي للمحوّل. قد تكون الواجهات غير متوافقة، ولكن الوظيفة الداخلية يجب أن تلبي الحاجة. يسمح نمط تصميم المحوّل للأصناف غير المتوافقة بالعمل معًا من خلال تحويل واجهة إحدى الأصناف إلى واجهة يتوقعها العملاء.

end;

  • procedure RechargeLightningPhone(const ALightningPhone: ILightningPhone);
  • begin
  • ALightningPhone.UseLightning;
  • ALightningPhone.Recharge;

@abstractmethod

  • def use_lightning(self):
  • raise NotImplementedError(NOT_IMPLEMENTED)
  • class FormatAndroid(RechargeTemplate):

end;

  • procedure RechargeMicroUSBPhone(const AMicroUSBPhone: IMicroUSBPhone);
  • begin
  • AMicroUSBPhone.UseMicroUSB;
  • AMicroUSBPhone.Recharge;

private String format(final String sourceValue) {

  • // Manipulate the source string into a format required
  • // by the object needing the source object's data
  • return sourceValue.trim;
  • }

وعلى صعيد آخر، //تلاعب وتحكم بالسلسة النصية في التنسيق المطلوب عن طريق الكائن الذي يحتاج لكائن البيانات

ملحق: مسرد المصطلحات الإنجليزية

وفي هذا الصدد، المقدمةنمط المحوّلadapter patternالمغلّف wrapperواجهة صنف بينيةclass interface الكود المصدري source codeنموذج كائن المستند Document Object Modelنظرة عامةتنفيذimplementصنف classغير متوافقة incompatibleيطلبها العملاء clients requireمحوّل منفصل adapterمحَوَلadapteeالهدف targetتكييف (تحويل)adaptsلغة النمذجة الموحدةUMLتعريفالوظيفة الداخليةinner functionalityواجهة إحدى الأصناف interface of one classالعملاءclientsاستخداممتعدد الأشكال polymorphic behaviorوقت التشغيل run-timeواجهة البناء facadeكائن أساسيunderlying objectمنفذ الديكور Decoratorتفويض Delegationالتركيب على الميراثcomposition over inheritanceواجهة البناء Facadeواجهة بينية مبسطة simplified interfaceهيكلوقت التجميع compile-timeمثيل من الصنفan instance of the classالكائن المُغلّفwrapped objectعدة واجهات متعددة الأشكالmultiple polymorphic interfacesالموجودة مسبقًا pre-existingصنف واجهة خالصة pure interface classتوارث الأصناف المتعددmultiple inheritance of classesمحوّل وقت التشغيل runtime adapterكائن "التنسيق" "formatting" objectنمط المصنع factory pattern"مزود" "provider"تخرجoutputsالبيانات المنسقة the data formattedيرجعreturnsالتنفيذ المحدد للمزود the specific implementation of the providerسجل عالميglobal registryتنسيق formatإخراجoutputبتعدد "الرؤية" multiple "views"التسلسل الهرمي للأصنافclass hierarchyتدفق البيانات الغير محددةarbitrary data flowsالتسلسل الهرمي للكائن الموجود to an existing object hierarchyمتغير خاص بصنف المحَوَل adaptee class variableكمعلمةparameterطريقة العميل ClientMethodمثيل المحوَل the adaptee instanceمحوَل adaptee

self.phone_adapter.recharge

  • class IPhoneRecharger(object):
  • def __init__(self):
  • self.phone = IPhone
  • self.phone.use_lightning

self.connector = False

def use_micro_usb(self):

print

IPhoneMicroUSBRecharger

وفي هذا الصدد، print("Recharging iPhone with MicroUSB using adapter pattern.")

String string = provider.getStringData;

وعلى صعيد آخر، classB.setStringData(string); أو بشكل أكثر إيجازًا: classB.setStringData(

((StringProvider)

puts

IphoneMicroUsbRecharger.new

في هذا الإطار، puts "Recharging iPhone with MicroUsb using Adapter pattern"

}

  • static void rechargeLightningPhone(LightningPhone phone) {
  • phone.useLightning;
  • phone.recharge;
  • }
  • public static void main(String[] args) {
  • Android android = new Android;
  • Iphone iPhone = new Iphone;
  • System.out.println("Recharging android with MicroUsb");
  • rechargeMicroUsbPhone(android);
  • System.out.println("Recharging iPhone with Lightning");
  • rechargeLightningPhone(iPhone);

end

AndroidRecharger.new

puts "Recharging android with MicroUsb Recharger"

{

  • echo "---Recharging iPhone with Generic Recharger---\n";
  • $this->phone = new IPhone;
  • $this->phoneAdapter = new IPhoneAdapter($this->phone);
  • $this->phoneAdapter->useMicroUsb;
  • $this->phoneAdapter->recharge;
  • echo "---iPhone Ready for use---\n\n";
  • }
  • }
  • $microUsbRecharger = new MicroUsbRecharger;
  • class IPhoneRecharger
  • {
  • private $phone;
  • public function __construct
  • {
  • echo "---Recharging iPhone with iPhone Recharger---\n";
  • $this->phone = new IPhone;
  • $this->phone->useLightning;
  • $this->phone->recharge;
  • echo "---iPhone Ready for use---\n\n";
  • }
  • }
  • $iPhoneRecharger = new IPhoneRecharger;
  • class AndroidRecharger
  • {
  • private $phone;
  • public function __construct

override def clientMethod: Unit = {

  • // call Adaptee's method(s) to implement Client's clientMethod */
  • }
  • }
  • }

type

  • TAndroid = class(TInterfacedObject, IMicroUSBPhone)
  • strict private
  • FConnector: Boolean;
  • public
  • procedure Recharge;
  • procedure UseMicroUSB;
  • end;

}

  • 2. اكتبْ صنف محوّل الذي يرجع التنفيذ المحدد للمزود:
  • public class ClassAFormat1Adapter extends Adapter {
  • public Object adapt(final Object anObject) {
  • return new ClassAFormat1((ClassA) anObject);
  • }

self.connector = False

def use_lightning(self):

AdapterFactory.getInstance

كذلك، .getAdapterFromTo(ClassA.class, ImageProvider.class, "تنسيق2");

وعلى صعيد آخر، ImageProvider provider = (ImageProvider) adapter.adapt(classA);

@abstractmethod

  • def use_micro_usb(self):
  • raise NotImplementedError(NOT_IMPLEMENTED)
  • class IPhone(FormatIPhone):
  • __name__ = "iPhone"
  • def __init__(self):

AdapterFactory.getInstance

ومن جهة أخرى، .getAdapterFromTo(ClassA.class, StringProvider.class, "تنسيق1");

ومن ناحية أخرى، StringProvider provider = (StringProvider) adapter.adapt(classA);

end;

  • المخرجات:
  • Recharging android with MicroUsb
  • MicroUsb connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with Lightning
  • Lightning connected
  • Recharge started
  • Recharge finished
  • Recharging iPhone with MicroUsb
  • MicroUsb connected
  • Lightning connected
  • Recharge started
  • Recharge finished
  • بي أتش بي
  • // Adapter Pattern example
  • interface IFormatIPhone
  • {
  • public function recharge;
  • public function useLightning;
  • }
  • interface IFormatAndroid
  • {
  • public function recharge;
  • public function useMicroUsb;
  • }
  • // Adaptee
  • class IPhone implements IFormatIPhone
  • {
  • private $connectorOk = FALSE;
  • public function useLightning
  • {
  • $this->connectorOk = TRUE;
  • echo "Lightning connected -$\n";
  • }
  • public function recharge

if @connector

puts "Recharge finished"

puts "Recharge started"

}

علاوةً على ذلك، } وربما إنشاء كائن «التنسيق» بشكل صحيح في وقت التشغيل عن طريق نمط المصنع.

نظرة عامة

وفي هذا الصدد، يعد نمط تصميم المحوّل أحد أنماط تصميم GoF الثلاثة والعشرون المعروفة التي تصف كيفية حل مشاكل التصميم المتكررة لتصميم برنامج مرن وقابل لإعادة الاستخدام، أي ذو توجيه كائني الذي يسهل تنفيذه، تغييره، اختباره وإعادة استخدامه.

وفي هذا السياق، الفكرة الرئيسية في هذا النمط هي العمل من خلال المحوّل المنفصل ، الذي يقوم بتكييف (تحويل) واجهة صنف (موجودة مسبقاً) دون تغييرها.

  • يحل نمط تصميم المحوّل مشاكل مثل:
  • كيف يمكن إعادة استخدام صنف لا يحتوي على واجهة يطلبها العميل؟
  • كيف يمكن للأصناف التي تحتوي على واجهات غير متوافقة أن تعمل معًا؟
  • كيف يمكن تُوفّر واجهة بديلة لصنف؟

وفي السياق ذاته، عرّف صنف محوّل منفصل يحول الواجهة (غير المتوافقة) للصنف المحَوَل إلى واجهة أخرى تُعتبر الهدف والتي يطلبها العملاء.

كذلك، غالبًا لا يمكن إعادة استخدام صنف (موجود بالفعل) فقط لأن واجهته لا تتوافق مع الواجهة التي يطلبها العملاء.

إضافةً إلى ذلك، لا يعرف العملاء إذا ما كانوا يعملون مع الصنف الهدف مباشرة أم من خلال محوّل مع صنف لا يحتوي على الواجهة الهدف .

يصف نمط تصميم المحوّل كيفية حل مثل هذه المشاكل:

وفي هذا الصدد، اعمل من خلال محوّل للعمل مع (إعادة استخدام) أصناف ليس لها الواجهة المطلوبة.

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

استخدام

هيكل

كذلك، يمكن استخدام المحوّل عندما يتوجب على المُغلّف الالتزام بواجهة معينة ويجب أن يدعم سلوك متعدد الأشكال. بدلاً من ذلك، منفذ نمط الديكور يمكّن من إضافة أو تغيير سلوك واجهة في وقت التشغيل، ويتم استخدام واجهة البناء عند الرغبة في واجهة أسهل أو أبسط لكائن أساسي.

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.