代理模式
结构
-
Subject接口
package 结构; /** * @Program: 设计模式 * @Description: Subject类定义了 RealSubject和Proxy的共用接口, * 这样就能在任何能够使用RealSubject的地方使用Proxy了 * @Author Mokairui * @Date 2020/12/5 11:46 */ public interface Subject { void request(); }
-
RealSubject具体实现类
package 结构; /** * @Program: 设计模式 * @Description: 定义了Proxy所代表的真实实体 * @Author Mokairui * @Date 2020/12/5 11:48 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("真实的请求"); } }
-
代理对象
package 结构; /** * @Program: 设计模式 * @Description: 保存一个引用使得代理可以访问实体,并提供一个于Subject的接口相同的接口, * 这样代理就可以用来替代实体 * @Author Mokairui * @Date 2020/12/5 11:50 */ public class Proxy implements Subject { private RealSubject realSubject; @Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); } // 调用方法,但是在这里就可以就可以添加你想要的额外功能等 realSubject.request(); } }
-
测试
package 结构; /** * @Program: 设计模式 * @Description: 测试类 * @Author Mokairui * @Date 2020/12/5 12:22 */ public class Demo { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.request(); } }
静态代理
-
礼物接口
package example.静态; /** * @Program: 设计模式 * @Description: 送礼物的接口 * @Author Mokairui * @Date 2020/12/5 13:43 */ public interface IGiveGift { void GiveDolls(); void GiveFlowers(); void GiveChocolate(); }
-
被追求者
package example.静态; /** * @Program: 设计模式 * @Description: 被追求者 * @Author Mokairui * @Date 2020/12/5 14:29 */ public class SchoolGirl { private String name; public SchoolGirl() { } public SchoolGirl(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
追求者
package example.静态; /** * @Program: 设计模式 * @Description: 追求者 * @Author Mokairui * @Date 2020/12/5 13:44 */ public class Pursuit implements IGiveGift { private SchoolGirl schoolGirl; public void setSchoolGirl(SchoolGirl schoolGirl) { this.schoolGirl = schoolGirl; } @Override public void GiveDolls() { System.out.println(schoolGirl.getName() + "送你洋娃娃"); } @Override public void GiveFlowers() { System.out.println(schoolGirl.getName() + "送你鲜花"); } @Override public void GiveChocolate() { System.out.println(schoolGirl.getName() + "送你巧克力"); } }
-
代理类
package example.静态; /** * @Program: 设计模式 * @Description: 代理类 * @Author Mokairui * @Date 2020/12/5 14:33 */ public class Proxy implements IGiveGift { private Pursuit pursuit; public void setPursuit(Pursuit pursuit) { this.pursuit = pursuit; } @Override public void GiveDolls() { System.out.println("我是代理了送洋娃娃,我可以在这里加额外需求"); pursuit.GiveDolls(); } @Override public void GiveFlowers() { System.out.println("我是代理了送鲜花,我可以在这里加额外需求"); pursuit.GiveFlowers(); } @Override public void GiveChocolate() { System.out.println("我是代理了送巧克力,我可以再这里加额外需求"); pursuit.GiveChocolate(); } }
-
测试
package example.静态; /** * @Program: 设计模式 * @Description: 测试类 * @Author Mokairui * @Date 2020/12/5 14:36 */ public class Demo { public static void main(String[] args) { SchoolGirl schoolGirl = new SchoolGirl("yanzi"); Pursuit pursuit = new Pursuit(); pursuit.setSchoolGirl(schoolGirl); Proxy proxy = new Proxy(); proxy.setPursuit(pursuit); proxy.GiveDolls(); System.out.println("-----------------"); proxy.GiveFlowers(); System.out.println("------------------"); proxy.GiveChocolate(); } }
动态代理
JDK代理
追求者和被追求者,送礼物的接口这里就不重复写了
-
DynamicProxyHandler类
package example.动态.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @Program: 设计模式 * @Description: 动态代理对象 * @Author Mokairui * @Date 2020/12/5 13:08 */ public class DynamicProxyHandler implements InvocationHandler { private Pursuit pursuit; public DynamicProxyHandler(Pursuit pursuit) { this.pursuit = pursuit; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if ("GiveDolls".equals(method.getName())) { // 用来区别增强的不同方法 System.out.print("最最可爱的"); } if ("GiveFlowers".equals(method.getName())) { // 针对不同的方法,增强不同的内容 System.out.println("五颜六色的哦"); } result = method.invoke(this.pursuit, args); return result; } }
-
测试类
package example.动态.jdk; import java.lang.reflect.Proxy; /** * @Program: 设计模式 * @Description: 测试类 * @Author Mokairui * @Date 2020/12/5 13:11 */ public class Demo { public static void main(String[] args) { Pursuit pursuit = new Pursuit(); pursuit.setSchoolGirl(new SchoolGirl("yanzi")); IGiveGift proxy = (IGiveGift) Proxy.newProxyInstance(pursuit.getClass().getClassLoader() , pursuit.getClass().getInterfaces() , new DynamicProxyHandler(pursuit)); proxy.GiveDolls(); System.out.println("---------------------"); proxy.GiveFlowers(); System.out.println("---------------------"); proxy.GiveChocolate(); } }
CGLIB代理
-
追求者的类,本来是实现接口,这里就变成了一个普通的类
package example.动态.cglib; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/14 22:15 */ public class Pursuit { private SchoolGift schoolGift; public void setSchoolGift(SchoolGift schoolGift) { this.schoolGift = schoolGift; } public void giveDolls() { System.out.println("追求者送" + schoolGift.getName() + "娃娃"); } public void giveFlowers() { System.out.println("追求者送" + schoolGift.getName() + "鲜花"); } public void giveChocolate() { System.out.println("追求者送" + schoolGift.getName() + "巧克力"); } }
-
代理类
package example.动态.cglib; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/14 22:26 */ public class DynamicProxyCglibHandler implements MethodInterceptor { // 需要代理的对象 private Pursuit pursuit; public DynamicProxyCglibHandler(Pursuit pursuit) { this.pursuit = pursuit; } /** * 代理的核心方法 * @param proxy * @param method * @param args * @param methodProxy * @return * @throws Throwable */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object obj = null; System.out.println("代理方法前"); method.invoke(pursuit, args); System.out.println("代理方法后"); return obj; } }
-
测试类
package example.动态.cglib; import net.sf.cglib.proxy.Enhancer; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/14 22:10 */ public class Demo { public static void main(String[] args) { SchoolGift schoolGift = new SchoolGift(); schoolGift.setName("燕子"); Pursuit pursuit = new Pursuit(); pursuit.setSchoolGift(schoolGift); Pursuit proxy = (Pursuit) Enhancer.create(pursuit.getClass(), new DynamicProxyCglibHandler(pursuit)); proxy.giveDolls(); System.out.println("-----------------"); proxy.giveFlowers(); System.out.println("----------------"); proxy.giveChocolate(); } }