+1 امتیاز
قبل در برنامه نویسی توسط (7.2هزار امتیاز)
ویرایش شده قبل توسط
الگوی طراحی آداپتور چیست و چگونه می توان آن را در کد خود بکار گیریم؟

1 پاسخ

+3 امتیاز
قبل توسط (1.4هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

هدف این الگوی طراحی، تبدیل interface موجود (جدید) به interface مورد انتظار سیستم است. وقتی کاربرد دارد که interface موجود قابل تغییر نباشد و شما هم نمی خواهید کٌدی که در سیستمتون زدید رو تغییر بدید.

مثال: فرض کنید سیستمی (که کامل و موجود است) دارید که می خواهید از کلاس(ها)یی از یک کتابخانه جدید ( سیستمتان قبلا از کتابخانه دیگر استفاده میکرد) استفاده کنید؛ ولی interface های موجود در کتابخانه جدید با  قدیمی متفاوت است. 

در ابتدا دو راه حل دارید:

  1. کُد کتابخانه جدید را تغییر دهید تا مطابق با سیستم موجود شود (که نوعا ممکن و معقول نیست)
  2. کُد سیستم را برای تطبیق با کتابخانه جدید تغییر دهید (که معمولا مطلوب نیست)

در الگوی طراحی adapter، کلاسی (کلاس Adapter) را برای تطبیقِ interface موجود (جدید) با interface مورد انتظار سیستم می سازیم؛ یعنی دیگر لازم نیست در سیستم یا کتابخانه جدید تغییری بدهیم. کلاس Adapter یک میانجی بین این دو interface است که request های سیستم را به request های قابل فهم برای کلاس کتابخانه جدید تبدیل می کند.

نمودار UMLای این الگو:

  • Adaptee: آن interface ای است که باید با سیستم جدید تطبیق یابد (در مثال: کلاس کتابخانه جدید)
  • Target: آن interface ای است که سیستم موجود با آن کار می کرده (در مثال: کلاس کتابخانه قدیمی)
  • Adapter: آن کلاسی است که عمل تطبیق را انجام می دهد (در مثال: Adapter)
  • Client: آن کلاس از سیستم موجود است که با interface مورد انتظار (یعنی target) کار می کند (در مثال: کلاسی از سیستم موجود که با interface مورد انتظارش کار می کند)

کُد (دقت شود که کلاس AdapteeImpl پیاده سازی کننده Adaptee است):

interface Adaptee 
{
	void specificRequest(Request request);
}

class AdapteeImpl implements Adaptee
{
	@Override
	public void specificRequest(Request request)
	{
		// implementation
	}
}


interface Target
{
	void request(String username, String password, String requestCode);
}

class Adapter implements Target
{
	private Adaptee adaptee = new AdapteeImpl();

	@Override
	public void request(String username, String password, String requestCode)
	{
		Request request = new Request(username,password,requestCode);
		adaptee.specificRequest(request);
	}
}


class Client
{
	private Target target = new Adapter();

	public void request(String username, String password, String requestCode)
	{
		target.request(username,password,requestCode);
	}
}


class Request
{
	private String username; 
	private String password; 
	private String requestCode;
	
	public Request(String username, String password, String requestCode)
	{
		super();
		this.username = username;
		this.password = password;
		this.requestCode = requestCode;
	}
}

 

سوالات مشابه

+1 امتیاز
1 پاسخ 443 بازدید
0 امتیاز
0 پاسخ 536 بازدید
0 امتیاز
0 پاسخ 451 بازدید
+2 امتیاز
2 پاسخ 3.2هزار بازدید
0 امتیاز
1 پاسخ 1.5هزار بازدید
+1 امتیاز
1 پاسخ 1.5هزار بازدید
+2 امتیاز
1 پاسخ 954 بازدید
+1 امتیاز
2 پاسخ 3.9هزار بازدید
...