Proxyデザインパターンは、構造デザインパターンの1つであり、私の意見では理解しやすいパターンの1つです。
Proxyデザインパターン
GoFによると、プロキシデザインパターンの意図は次のとおりです:別のオブジェクトの代理またはプレースホルダーを提供して、それにアクセスを制御します。 定義自体は非常に明確であり、プロキシデザインパターンは機能の制御されたアクセスを提供したい場合に使用されます。たとえば、システム上でコマンドを実行できるクラスがあるとします。このクラスを使用している場合は問題ありませんが、このプログラムをクライアントアプリケーションに提供したい場合、クライアントプログラムがシステムファイルを削除したり、設定を変更したりする問題が発生する可能性があります。ここで、プロキシクラスを作成して、プログラムの制御されたアクセスを提供できます。
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.");
}
}
プロキシデザインパターン – プロキシクラス
以上のクラスへの完全なアクセスを管理者ユーザーのみに提供したい場合、管理者でない場合は制限されたコマンドのみが許可されます。以下は非常にシンプルなプロキシクラスの実装です。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