Паттерн проектирования “Прокси”

Паттерн проектирования Proxy является одним из структурных паттернов проектирования и, на мой взгляд, одним из самых простых для понимания.

Паттерн проектирования Proxy

Намерение паттерна проектирования Proxy, согласно GoF, заключается в том, чтобы предоставить заместителя или заполнитель для другого объекта, чтобы контролировать доступ к нему. Само определение очень ясное, и паттерн проектирования Proxy используется, когда мы хотим предоставить контролируемый доступ к функциональности. Допустим, у нас есть класс, который может выполнять некоторую команду в системе. Теперь, если мы его используем, это нормально, но если мы хотим предоставить эту программу клиентскому приложению, могут возникнуть серьезные проблемы, потому что клиентская программа может выдать команду на удаление некоторых системных файлов или изменение некоторых настроек, которые вы не хотите. Здесь может быть создан класс-прокси, чтобы предоставить контролируемый доступ к программе.

Паттерн проектирования Proxy – Главный класс

Поскольку мы пишем на Java в терминах интерфейсов, вот наш интерфейс и его реализующий класс. CommandExecutor.java

package com.journaldev.design.proxy;

public interface CommandExecutor {

	public void runCommand(String cmd) throws Exception;
}

CommandExecutorImpl.java

package com.journaldev.design.proxy;

import java.io.IOException;

public class CommandExecutorImpl implements CommandExecutor {

	@Override
	public void runCommand(String cmd) throws IOException {
                //некоторая сложная реализация
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Шаблон проектирования Proxy – Класс Прокси

Теперь мы хотим предоставить полный доступ только администраторам к указанному классу, если пользователь не является администратором, то ему разрешены только ограниченные команды. Вот наша очень простая реализация класса прокси. CommandExecutorProxy.java

package com.journaldev.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

ProxyPatternTest.java

package com.journaldev.design.test;

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());
		}
		
	}

}

Результат выполнения примера программы с использованием вышеуказанного шаблона проектирования Proxy:

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

Общие применения шаблона проектирования Proxy – это управление доступом или предоставление оберточной реализации для повышения производительности. Пакет Java RMI использует шаблон проектирования Proxy. Вот и все для шаблона проектирования Proxy в Java.

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