Proxyパターンのサンプルコードです。
package org.example.proxy;
public interface Subject {
void request1();
void request2();
}
package org.example.proxy;
public class RealSubject implements Subject {
@Override
public void request1() {
// 時間のかかる処理
}
@Override
public void request2() {
// 時間のかかる処理
}
}
package org.example.proxy;
public class Proxy implements Subject{
private RealSubject real;
@Override
public synchronized void request1() {
realize();
real.request1();
}
@Override
public synchronized void request2() {
realize();
real.request2();
}
private void realize() {
if(real == null) {
real = new RealSubject();
}
}
}
package org.example.proxy;
public class Main {
public static void main(String[] args) {
Subject subject = new Proxy();
subject.request1();
subject.request2();
}
}
Proxyパターンは時間のかかる処理を実行する際、クラスを一つ噛ませて一部の処理を代行(Proxy)するパターンです。
上のサンプルコードではRealSubjectが時間のかかる処理を行い、それを実行する前にProxyが実行されます。
ProxyとReadSubjectはSubjectという共通のインターフェースを持っています。
この例では、「直接ReadSubjectを実行してもいいんじゃね?」って思いますが、
実際に利用されるパターンとしては、ReadSubjectでは時間のかかる処理のみを実装し、それ以外の処理をProxyで処理させる、というのが一般的のようです。