代理设计模式

代理设计模式是结构型设计模式之一,我认为是最简单易懂的设计模式之一。

代理设计模式

代理设计模式的意图根据 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 {
                //一些重要实现
		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中的代理设计模式的全部内容。

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