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

2025-10-25 20:01:12

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。
猜你喜欢