代理设计模式:两个子类共同实现一个接口,一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作
代理设计模式的本质:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。
/* * 静态代理设计模式的一般写法 *代理设计模式:两个子类共同实现一个接口, *一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作 * */ //接口 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(); } }
以这种代理设计只能够代理一个接口的子类对象,无法代理更 多的接口子类对象。