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