反射与代理设计模式-基础代理设计模式

2025-05-24 07:56:18

1、基础代理设计整体架构图:.

反射与代理设计模式-基础代理设计模式

2、 在实际的开发之中有两大核心设计模式:工厂设计模式、代理设计模式。我们本次就利用反射进行代理设计模式的加强。 现在分析代理设计模式的问题:代理设计模式的核心本质在于:一个接口有两个子类,一个负责真实业务,另外一个负责与真实业务有关的所有辅助性的操作。那么按照这样的原则,一个基础的代理设计结构如下:package com.gwolf.design;import java.lang.reflect.Constructor;//代理设计的核心在于需要有一个核心的操作接口interface ISubject { //直返是整体的核心业务 public void eat();}class RealSubject implements ISubject { @Override public void eat() { System.out.println("饿了一定要吃饭!"); } }class ProxySubject implements ISubject { private ISubject subject; public ProxySubject(ISubject subject) { this.subject = subject; } public void prepare() { System.out.println("需要准备食材,收拾食材!"); } public void clear() { System.out.println("洗刷碗筷"); } @Override public void eat() { this.prepare(); this.subject.eat(); this.clear(); }}class Factory { @SuppressWarnings("unchecked") public static <T> T getInstance(String className) { T t = null; try { t = (T)Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return t; } @SuppressWarnings("unchecked") public static <T> T getInstance(String className,Object obj) { T t = null; try { Constructor<?> constructor = Class.forName(className). getConstructor(obj.getClass().getInterfaces()[0]); t = (T)constructor.newInstance(obj); } catch (Exception e) { e.printStackTrace(); } return t; }}public class ProxyDesign { public static void main(String[] args) { ISubject subject = Factory.getInstance("com.gwolf.design.ProxySubject", Factory.getInstance("com.gwolf.design.RealSubject")); subject.eat(); }}

反射与代理设计模式-基础代理设计模式

3、执行我们的main方法:

反射与代理设计模式-基础代理设计模式

4、以上的程序如果结合了反射之后整体的处理会非常的繁杂,而且繁杂的不只是开发端,磴涡湿蟾客户端也很复杂。对于以上的操作客户端不应该关注特别多的内容,也就是说客户端唯一可能需要知道的就是代理是谁,真实是谁,程序可以进行如下修改:修改工厂类。class Factory { @SuppressWarnings("unchecked") public static <T> T getInstance(String className) { T t = null; try { t = (T)Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return t; } @SuppressWarnings("unchecked") public static <T> T getInstance(String proxyClassName,String realClassName) { T t = null; try { T obj = getInstance(realClassName);//取得真实的接口对象 Constructor<?> constructor = Class.forName(proxyClassName). getConstructor(obj.getClass().getInterfaces()[0]); t = (T)constructor.newInstance(obj); } catch (Exception e) { e.printStackTrace(); } return t; }}

反射与代理设计模式-基础代理设计模式

5、修改之后再次执行我们的main方法:

反射与代理设计模式-基础代理设计模式

6、那么现在的问题出现了,在开发中不知道一个项目中有多少个接口,那么如果所有的这些接口都需要使用到代理类会如何?几乎每一个接口都要编写两个子类,那么假设这所有接口的代理类的功能几乎都一样。之前的这种代理设计严格来讲只是一种最简单的代理设计。所以这种代理设计只能够代理一个接口的子类对象,无法代理更多的接口子类对象,那么这种开发是不可能在实际工作中出现的。要想解决此问题,我们要使用动态代理模式。

反射与代理设计模式-基础代理设计模式
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢