نمط المحول
المحتويات
- def use_micro_usb
- AdapterFactory.getInstance
- نمط محوّل الكائن
- public class AdapterDemo {
- نمط محوّل الصنف
- سكالا
- RECHARGE = ["Recharge started.", "Recharge finished."]
- self.phone.recharge
- WriteLn('Recharging iPhone with MicroUsb');
- type
- @connector = true
- puts
- private final LightningPhone lightningPhone;
- {
- end;
- بايثون
- {
- System.out.println("Recharging iPhone with MicroUsb");
- phone = Iphone.new
- AdapterFactory.getInstance
- .getStringData);
- self.phone = IPhone
- }
- الدافع من الحل وقت التجميع
- {
- self.connector = True
- self.connector = True
- @abstractmethod
- type
- self.phone.recharge
- self.mobile = mobile
- else
- }
- public
- }
- from abc import ABCMeta, abstractmethod
- self.mobile.use_lightning
- classC.setImage(provider.getImage);
- حل محوّل وقت التشغيل
- private $mobile;
- private getter mobile : FormatIphone
- if @connector
- self.mobile.recharge
- مخطط الصنف بلغة النمذجة الموحدة
- else
- تنفيذ نمط المحوّل
- @connector = true
- تعريف
- end;
- @abstractmethod
- end;
- private String format(final String sourceValue) {
- ملحق: مسرد المصطلحات الإنجليزية
- self.phone_adapter.recharge
- self.connector = False
- String string = provider.getStringData;
- puts
- }
- end
- {
- override def clientMethod: Unit = {
- type
- }
- self.connector = False
- AdapterFactory.getInstance
- @abstractmethod
- AdapterFactory.getInstance
- end;
- if @connector
- }
- نظرة عامة
- استخدام
على سبيل التعريف، في هندسة البرمجيات، نمط المحوّل هو نمط تصميم برمجيات (يُعرف كذلك باسم المغلّف؛ تسمية بديلة مشتركة مع نمط الديكور) يسمح لواجهة صنف موجود مسبقاً ليُستعمل كواجهة أخرى. غالبًا ما يتم استخدامه لجعل الأصناف الموجودة تعمل مع الآخرين دون تعديل الكود المصدري الخاص بهم. ونتناول فيما يلي مزيدًا من التفاصيل.
إضافةً إلى ذلك، مثال على ذلك هو المحوّل الذي يحوّل واجهة نموذج كائن المستند من مستند 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("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):
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 الثلاثة والعشرون المعروفة التي تصف كيفية حل مشاكل التصميم المتكررة لتصميم برنامج مرن وقابل لإعادة الاستخدام، أي ذو توجيه كائني الذي يسهل تنفيذه، تغييره، اختباره وإعادة استخدامه.
وفي هذا السياق، الفكرة الرئيسية في هذا النمط هي العمل من خلال المحوّل المنفصل ، الذي يقوم بتكييف (تحويل) واجهة صنف (موجودة مسبقاً) دون تغييرها.
- يحل نمط تصميم المحوّل مشاكل مثل:
- كيف يمكن إعادة استخدام صنف لا يحتوي على واجهة يطلبها العميل؟
- كيف يمكن للأصناف التي تحتوي على واجهات غير متوافقة أن تعمل معًا؟
- كيف يمكن تُوفّر واجهة بديلة لصنف؟
وفي السياق ذاته، عرّف صنف محوّل منفصل يحول الواجهة (غير المتوافقة) للصنف المحَوَل إلى واجهة أخرى تُعتبر الهدف والتي يطلبها العملاء.
كذلك، غالبًا لا يمكن إعادة استخدام صنف (موجود بالفعل) فقط لأن واجهته لا تتوافق مع الواجهة التي يطلبها العملاء.
إضافةً إلى ذلك، لا يعرف العملاء إذا ما كانوا يعملون مع الصنف الهدف مباشرة أم من خلال محوّل مع صنف لا يحتوي على الواجهة الهدف .
يصف نمط تصميم المحوّل كيفية حل مثل هذه المشاكل:
وفي هذا الصدد، اعمل من خلال محوّل للعمل مع (إعادة استخدام) أصناف ليس لها الواجهة المطلوبة.
انظر كذلك الرسم التخطيطي للصنف بلفة النمذجة الموحدة أدناه.
استخدام
هيكل
كذلك، يمكن استخدام المحوّل عندما يتوجب على المُغلّف الالتزام بواجهة معينة ويجب أن يدعم سلوك متعدد الأشكال. بدلاً من ذلك، منفذ نمط الديكور يمكّن من إضافة أو تغيير سلوك واجهة في وقت التشغيل، ويتم استخدام واجهة البناء عند الرغبة في واجهة أسهل أو أبسط لكائن أساسي.
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟