Proxy Pattern en Java
Proxy est un modèle de conception qui permet à un objet d'apparaître sous la forme d'un autre objet et d'accéder à l'objet d'origine via l'objet proxy. Les proxys sont largement utilisés dans de nombreuses applications, la plus courante étant la mise en œuvre d'appels d'objets distants et la journalisation sur le réseau.
Il existe également de nombreux exemples d'utilisation du modèle proxy en Java. Le modèle de proxy en Java est principalement implémenté des trois manières suivantes :
Le proxy statique est implémenté en créant une classe proxy pendant la phase de compilation. La classe proxy et la classe d'origine implémentent la même interface, et la classe proxy implémente ses propres méthodes en appelant les méthodes de la classe d'origine. L'avantage du proxy statique est qu'il est relativement simple et intuitif, mais l'inconvénient est que la classe proxy doit être écrite manuellement. Lorsque la méthode proxy est ajoutée ou modifiée, la classe proxy doit être modifiée en conséquence.
Voici un exemple simple de proxy statique :
// 定义接口 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();
Le proxy dynamique consiste à créer une classe proxy via un mécanisme de réflexion au moment de l'exécution. Contrairement aux proxys statiques, les proxys dynamiques peuvent proxy plusieurs interfaces et n'ont pas besoin d'écrire manuellement des classes proxy. L’avantage du proxy dynamique est qu’il est plus flexible, mais l’inconvénient est qu’il a un certain impact sur les performances.
Voici un exemple simple de proxy dynamique :
// 定义接口 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();
Le proxy CGLIB est implémenté en générant une sous-classe de la classe d'origine. Les proxys CGLIB peuvent proxy des classes qui n'implémentent pas d'interfaces et sont plus rapides que les proxys dynamiques. Cependant, le proxy CGLIB présente également l'inconvénient de nécessiter que la classe d'origine ne puisse pas être définitive et que toutes les méthodes ne soient pas définitives.
Voici un exemple simple de proxy 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();
Résumé
Le modèle de proxy est un modèle de conception couramment utilisé qui fournit des fonctionnalités supplémentaires à la classe d'origine sans la modifier. En Java, il existe trois manières d'implémenter le modèle de proxy : proxy statique, proxy dynamique et proxy CGLIB. Différentes méthodes de mise en œuvre ont leurs propres avantages et inconvénients et peuvent être sélectionnées et utilisées en fonction de circonstances spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!