منبع اصلی نوشتار زیر در این لینک قرار دارد

الگوی طراحی Proxy در جاوا

الگوی طراحی Proxy یکی از الگوهای طراحی ساختارمند در شئ گرایی است که در واقع یکی از ساده ترین الگوها هم هست.

 

 الگوی طراحی Proxy چیست؟

مقصود الگوی طراحی Proxy ارائه جانشین و واسطه ای برای دسترسی به یک شئ دیگر است تا کنترل آن شئ به این شکل انجام شود.

همین تعریف به اندازه کافی شفاف است و می تواند نامگذاری Proxy را برای این الگوی طراحی توجیه کند. در واقع زمانی که ما میخواهیم دسترسی مشخص و کنترل شده ای از شئ ساخته شده از یک کلاس دیگر را ارائه بدهیم، به سراغ الگوی Proxy می رویم.

بیایید تصور کنیم که یک کلاس داریم که می تواند دستوراتی را روی خط فرمان سیستم عامل اجرا کند. حال اگر ما خودمان به تنهایی از این قابلیت استفاده کنیم مشکلی نیست، چرا که مدیر سیستم هستیم؛ ولی اگر این برنامه را بدون هیچ کنترل خاصی رو دسترسی و اجرا به مشتری بدهیم، می تواند مشکلاتی ایجاد کند.

بدون اعمال کنترل دسترسی به کلاس مذکور، به طور مثال مشکلاتی از قبیل دسترسی مشتری به فایل های اصلی سیستم و توانایی ارسال دستور حذف آنها رخ می دهد که نتیجه آن از کار افتادن سیستم است.

پس یک کلاس واسط یا Proxy برای ارائه دسترسی کنترل شده به عنوان واسط کلاس اصلی می سازیم.

پیاده سازی الگوی طراحی  Proxy

کلاس های متفاوتی برای پیاده سازی مثال نیاز داریم که به ترتیب می سازیم. اول از همه به سراغ کلاس اصلی اجرا کننده دستورات خط فرمان می رویم. در ضمن پیاده سازی را با زبان جاوا انجام می دهیم.

الگوی طراحی  Proxy – کلاس اصلی

پیاده سازی را با تعریف یک interface شروع می کنیم و سپس تعریف آن را در کلاس بعدی کامل می کنیم.

فایل CommandExecutor.java :

package example.design.proxy;

public interface CommandExecutor {

	public void runCommand(String cmd) throws Exception;
}

 

فایل CommandExecutorImpl.java :

package example.design.proxy;

import java.io.IOException;

public class CommandExecutorImpl implements CommandExecutor {

	@Override
	public void runCommand(String cmd) throws IOException {
                //some heavy implementation
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

 

الگوی طراحی  Proxy – کلاس واسط

حالا می خواهیم کاری کنیم که تنها کاربر مدیر یا همان admin دسترسی کامل به کلاس بالایی برای اجرای همه دستورات را داشته باشد. اگر کاربر وارد شده مدیر نیست، فقط دستورات محدودی را مجاز است که اجرا کند.

اینجا پیاده سازی ساده ما از کلاس Proxy را می بینید که الگوی خوبی برای طراحی های پیچیده تر شماست:

 

فایل CommandExecutorProxy.java :

package example.design.proxy;

public class CommandExecutorProxy implements CommandExecutor {

	private boolean isAdmin;
	private CommandExecutor executor;
	
	public CommandExecutorProxy(String user, String pwd){
		if("Pankaj".equals(user) && "J@urnalD$v".equals(pwd)) isAdmin=true;
		executor = new CommandExecutorImpl();
	}
	
	@Override
	public void runCommand(String cmd) throws Exception {
		if(isAdmin){
			executor.runCommand(cmd);
		}else{
			if(cmd.trim().startsWith("rm")){
				throw new Exception("rm command is not allowed for non-admin users.");
			}else{
				executor.runCommand(cmd);
			}
		}
	}

}

 

الگوی طراحی  Proxy – برنامه کاربردی مشتری

حالا باید برنامه ای که مشتری دارد را به شکلی بنویسیم که مشخصات کاربری را برای احراز هویت و ورود بگیرد و به کلاس Proxy دهد تا در شئ کلاس Proxy نوع کاربر و مجوز مشخص شود.

همچنین بتواند دستورات را بگیرد و برای اجرا به همان شئ کلاس Proxy تحویل دهید تا در صورت مجاز بودن، در کلاس اصلی یعنی CommandExecutorImpl ، اجرا شود.

 

فایل ProxyPatternTest.java :

package example.design.proxy;

import com.journaldev.design.proxy.CommandExecutor;
import com.journaldev.design.proxy.CommandExecutorProxy;

public class ProxyPatternTest {

	public static void main(String[] args){
		CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");
		try {
			executor.runCommand("ls -ltr");
			executor.runCommand(" rm -rf abc.pdf");
		} catch (Exception e) {
			System.out.println("Exception Message::"+e.getMessage());
		}
		
	}

}

خروجی اجرای همه کدهای بالا به شکل زیر است:

'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.

جمع بندی

این مثالی از مفهوم الگوی طراحی Proxy بود. امیدوارم برای شما مفید بوده باشد.  الگوی طراحی Proxy معمولاً برای کنترل دسترسی یا ارائه کلاس پوششی برای کارایی بهتر، استفاده می شود.

برای مثال بسته Java RMI از الگوی طراحی Proxy استفاده می کند.

 

 

منبع انتشار این آموزش، مطلبی با عنوان Proxy Design Pattern بوده است.

 

 

نوشته الگوی طراحی Proxy در جاوا اولین بار در اوپن مایند. پدیدار شد.



برچسب ها :