Паттерн проектирования 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