ホームページ  >  記事  >  Java  >  Javaのプロキシパターン

Javaのプロキシパターン

王林
王林オリジナル
2023-06-07 23:22:063310ブラウズ

Java のプロキシ パターン

プロキシは、オブジェクトを別のオブジェクトの形式で表示し、プロキシ オブジェクトを通じて元のオブジェクトにアクセスできるようにする設計パターンです。プロキシは多くのアプリケーションで広く使用されており、最も一般的なものは、リモート オブジェクトの呼び出しとネットワークへのログ記録を実装することです。

Java でのプロキシ パターンの使用例も多数あります。 Java のプロキシ モードは、主に次の 3 つの方法で実装されます。

  1. 静的プロキシ

静的プロキシは、コンパイル フェーズでプロキシ クラスを作成することによって実装されます。プロキシ クラスと元のクラスは同じインターフェイスを実装し、プロキシ クラスは元のクラスのメソッドを呼び出すことで独自のメソッドを実装します。静的プロキシの利点は、比較的シンプルで直感的であることですが、欠点は、プロキシ クラスを手動で記述する必要があることであり、プロキシ メソッドを追加または変更すると、それに応じてプロキシ クラスも変更する必要があります。

次は、単純な静的プロキシの例です。

// 定义接口
interface UserManager {
    void add();
    void delete();
}

// 原始类
class UserManagerImpl implements UserManager {
    public void add() {
        System.out.println("添加用户");
    }

    public void delete() {
        System.out.println("删除用户");
    }
}

// 代理类
class UserManagerProxy implements UserManager {
    private UserManager userManager;

    public UserManagerProxy(UserManager userManager) {
        this.userManager = userManager;
    }

    public void add() {
        System.out.println("记录日志...");
        userManager.add();
        System.out.println("记录日志...");
    }

    public void delete() {
        System.out.println("记录日志...");
        userManager.delete();
        System.out.println("记录日志...");
    }
}

// 客户端代码
UserManager userManager = new UserManagerImpl();
UserManagerProxy userManagerProxy = new UserManagerProxy(userManager);
userManagerProxy.add();
userManagerProxy.delete();
  1. 動的プロキシ

動的プロキシは、実行時にリフレクション メカニズムを通じてプロキシ クラスを作成します。静的プロキシとは異なり、動的プロキシは複数のインターフェイスをプロキシできるため、プロキシ クラスを手動で記述する必要はありません。動的プロキシの利点は柔軟性が高いことですが、欠点はパフォーマンスに一定の影響を与えることです。

次は、簡単な動的プロキシの例です。

// 定义接口
interface UserManager {
    void add();
    void delete();
}

// 原始类
class UserManagerImpl implements UserManager {
    public void add() {
        System.out.println("添加用户");
    }

    public void delete() {
        System.out.println("删除用户");
    }
}

// 代理类
class MyInvocationHandler implements InvocationHandler {
    private UserManager userManager;

    public MyInvocationHandler(UserManager userManager) {
        this.userManager = userManager;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("记录日志...");
        Object result = method.invoke(userManager, args);
        System.out.println("记录日志...");
        return result;
    }
}

// 客户端代码
UserManager userManager = new UserManagerImpl();
InvocationHandler handler = new MyInvocationHandler(userManager);
UserManager proxy = (UserManager) Proxy.newProxyInstance(
    userManager.getClass().getClassLoader(),
    userManager.getClass().getInterfaces(),
    handler
);
proxy.add();
proxy.delete();
  1. CGLIB プロキシ

CGLIB プロキシは、元のクラスのサブクラスを生成することによって実装されます。 CGLIB プロキシは、インターフェイスを実装していないクラスをプロキシでき、動的プロキシよりも高速です。ただし、CGLIB プロキシには、元のクラスが Final であってはならず、すべてのメソッドが Final であってはいけないという欠点もあります。

次は、単純な CGLIB プロキシの例です。

// 原始类
class UserManager {
    public void add() {
        System.out.println("添加用户");
    }

    public void delete() {
        System.out.println("删除用户");
    }
}

// 代理类
class MyMethodInterceptor implements MethodInterceptor {
    private UserManager userManager;

    public MyMethodInterceptor(UserManager userManager) {
        this.userManager = userManager;
    }

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("记录日志...");
        Object result = method.invoke(userManager, args);
        System.out.println("记录日志...");
        return result;
    }
}

// 客户端代码
UserManager userManager = new UserManager();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserManager.class);
enhancer.setCallback(new MyMethodInterceptor(userManager));
UserManager proxy = (UserManager) enhancer.create();
proxy.add();
proxy.delete();

概要

プロキシ パターンは、追加の機能を提供するために使用できる一般的に使用される設計パターンです。 Java では、プロキシ パターンを実装する方法として、静的プロキシ、動的プロキシ、CGLIB プロキシの 3 つの方法があります。さまざまな実装方法にはそれぞれ長所と短所があり、特定の状況に応じて選択して使用できます。

以上がJavaのプロキシパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。