代理设计模式:两个子类共同实现一个接口,一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作
代理设计模式的本质:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。
/*
* 静态代理设计模式的一般写法
*代理设计模式:两个子类共同实现一个接口,
*一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作
* */
//接口
interface ISubject1{
//核心功能是买东西
void buySomething();
}
//真实实现类
class RealPracticalClass implements ISubject1{
public void buySomething() {
//真实要实现的事情
System.out.println("需要要买一个电脑");
}
}
//代理辅助类
class ProxyAssistClass implements ISubject1{
//真实的操作业务
RealPracticalClass realPracticalClass = new RealPracticalClass();
//构造方法
public ProxyAssistClass(RealPracticalClass realPracticalClass) {
super();
this.realPracticalClass = realPracticalClass;
}
public void BeforeBuySomething() {
System.out.println("买东西之前的准备工作");
}
public void AfterBuySomething() {
System.out.println("买东西之后的后续工作");
}
public void buySomething() {
//真实业务前期
this.BeforeBuySomething();
//调用真实业务
this.realPracticalClass.buySomething();
//真实业务执行后
this.AfterBuySomething();
}
}
//工厂类
class Factory1{
public static ISubject1 getInstance() {
//产生代理类的实例化对象并返回
return new ProxyAssistClass(new RealPracticalClass());
}
}
public class ProxyDesignPattern {
public static void main(String[] args) {
//向上转型
ISubject1 iSubject = Factory1.getInstance();
//调用核心功能
iSubject.buySomething();
}
}
在我们学了反射机制后,可利用反射来取得类对象,而不用自己的定义,只需对工厂类进行修改,如下。
/*
* 反射机制改良静态代理设计模式
* */
//接口
interface ISubject1{
//核心功能是买东西
void buySomething(); 实现类
}
//真实实现类
class RealPracticalClass implements ISubject1{
public void buySomething() {
//真实要实现的事情
System.out.println("需要要买一个电脑");
}
}
//代理辅助类
class ProxyAssistClass implements ISubject1{
//接口对象
private ISubject1 iSubject1;
//构造方法获取接口
public ProxyAssistClass(ISubject1 iSubject1) {
super();
this.iSubject1 = iSubject1;
}
public void BeforeBuySomething() {
System.out.println("买东西之前的准备工作");
}
public void AfterBuySomething() {
System.out.println("买东西之后的后续工作");
}
public void buySomething() {
//真实业务前期
this.BeforeBuySomething();
//调用真实业务
this.iSubject1.buySomething();
//真实业务执行后
this.AfterBuySomething();
}
}
工厂类
class Factory1{
//无参构造私有化
private Factory1() {}
//取得真实类对象(其包含默认的无参构造)
public static <T> T getRealInstance(String realPathName) throws Exception {
T t = null;
Class<?> class1 =Class.forName(realPathName);
return t = (T) class1.newInstance();
}
//取得代理类对象
public static <T> T getProxyInstance(String proxyPathName,String realPathName) throws Exception{
//拿到真实类的对象
T realClass = getRealInstance(realPathName);
Class<?> class1 = Class.forName(proxyPathName);
//取得代理类的构造方法
Constructor constructor = class1.getDeclaredConstructor(class1.getInterfaces()[0]);
T t1 = (T) constructor.newInstance(realClass);
return t1;
}
}
public class ProxyDesignPattern {
public static void main(String[] args) throws Exception {
ISubject1 iSubject1 = Factory1.getProxyInstance("reflect.ProxyAssistClass", "reflect.RealPracticalClass");
iSubject1.buySomething();
}
}
以这种代理设计只能够代理一个接口的子类对象,无法代理更 多的接口子类对象。