持续创作,加速成长!这是我参与「掘金日新计划 · 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中的代理设计模式