设计模式-代理(译)

136 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

代理模式是一种结构设计模式(Structural design pattern),在我看来也是最好理解的设计模式之一

代理设计模式

代理模式的主要作用是:

提供一个代理或替代对象,用于其他对象访问控制目标对象 代理模式的定义很清楚,就是用于提供一个访问控制功能

举个例子,我们有一个类可以在系统上执行一些命令。我们可以给这个程序给客户程序使用,但是这儿有一些问题,因为客户程序可以通过这个类执行一些不是我们想要的操作,比如删除系统文件或修改系统设置

这儿我们创建一个代理类来控制访问这个程序

代理设计模式 - Main Class

在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中的代理设计模式

原文链接