代理设计模式
代理设计模式是结构设计模式之一,在我看来,它是最容易理解的模式之一。
代理设计模式
根据 GoF,代理设计模式的意图是:为另一个对象提供代理或占位符以控制对它的访问。定义本身非常清晰,当我们想要提供对功能的受控访问时,就会使用代理设计模式。假设我们有一个可以在系统上运行某些命令的类。现在,如果我们使用它,那就没问题了,但如果我们想将该程序提供给客户端应用程序,则可能会出现严重问题,因为客户端程序可以发出命令来删除某些系统文件或更改您不想要的某些设置。在这里可以创建一个代理类来提供对程序的受控访问。
代理设计模式 - 主类
由于我们按照接口来编写 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 {
//some heavy implementation
Runtime.getRuntime().exec(cmd);
System.out.println("'" + cmd + "' command executed.");
}
}
代理设计模式 - 代理类
现在我们只想让管理员用户拥有上述类的完全访问权限,如果用户不是管理员,则只允许执行有限的命令。这是我们非常简单的代理类实现。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);
}
}
}
}
代理设计模式客户端程序
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());
}
}
}
上述代理设计模式示例程序的输出为:
'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.
代理设计模式的常见用途是控制访问或提供包装器实现以获得更好的性能。Java RMI 包使用代理模式。这就是 Java 中的代理设计模式的全部内容。