20171030_chr_proxy 代理模式(动态代理)
2017-12-14 14:00
260 查看
代理模式(动态代理)
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/Dog.javapackage nuc.sw.dynamic.proxy; public interface Dog { public void info(); public void run(); public void cry(); }
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/DogImpl.java
package nuc.sw.dynamic.proxy; public class DogImpl implements Dog { @Override public void info() { // TODO Auto-generated method stub System.out.println("一只薛皮皮"); } @Override public void run() { // TODO Auto-generated method stub System.out.println("薛皮皮骑着Clearlove7的猪跑了"); } @Override public void cry() { // TODO Auto-generated method stub System.out.println("薛皮皮成为嚎哭深渊领主"); } }
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyInterceptor.java
package nuc.sw.dynamic.proxy; public class MyInterceptor { public void method1() { System.out.println("模拟Struts框架中访问action之前拦截器执行的代码"); } public void method2() { System.out.println("模拟Struts框架中访问action之后拦截器执行的代码"); } }
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyProxyFactory.java
package nuc.sw.dynamic.proxy; import java.lang.reflect.Proxy; public class MyProxyFactory { public static Object getProxy(Object object,String methodName) { ProxyHandler handler=new ProxyHandler(object, methodName); return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler); } }
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/ProxyHandler.java
package nuc.sw.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ProxyHandler implements InvocationHandler { private Object target; private String methodName; private MyInterceptor mi=new MyInterceptor(); public ProxyHandler(Object target,String methodName) { this.target=target; this.methodName=methodName; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub Object result=null; if(method.getName().equals(methodName)) { mi.method1(); result=method.invoke(target, args); mi.method2(); }else { result=method.invoke(target, args); } return result; } }
/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/TestDynamicProxy.java
package nuc.sw.dynamic.proxy; import nuc.sw.proxy.*; public class TestDynamicProxy { public static void main(String[] args) { // TODO Auto-generated method stub //案例一:狗代理 //1.产生一个真实主题角色 Dog dog=new DogImpl(); //2.代理主题角色 Dog dogProxy=(Dog) MyProxyFactory.getProxy(dog, "info"); //3.通过代理主题角色访问真实主题角色方法 dogProxy.info(); dogProxy.run(); dogProxy.cry(); //案例二 BookAbstractSubject publisher=new Publisher(); BookAbstractSubject publisherProxy=(BookAbstractSubject)MyProxyFactory.getProxy(publisher, "saleBook"); publisherProxy.saleBook(); } }
/20171030_chr_proxy/src/nuc/sw/proxy/BookAbstractSubject.java
package nuc.sw.proxy; public interface BookAbstractSubject { public void saleBook(); }
/20171030_chr_proxy/src/nuc/sw/proxy/Publisher.java
package nuc.sw.proxy; public class Publisher implements BookAbstractSubject{ public void saleBook() { // TODO Auto-generated method stub System.out.println("真实主题角色出版社卖书"); } public void makeBook() { System.out.println("真实主题角色出版社造书"); } }
/20171030_chr_proxy/src/nuc/sw/proxy/ShoppingOnline.java
package nuc.sw.proxy; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ShoppingOnline implements BookAbstractSubject{ private Publisher publisher=new Publisher(); public void presaleBook() { // TODO Auto-generated method stub System.out.println("代理主题角色网上商店买书前宣传"); } public void postsaleBook() { System.out.println("代理主题角色网上商店卖书后售后服务"); } public void saleBook() { // TODO Auto-generated method stub /*this.presaleBook(); publisher.saleBook(); this.postsaleBook(); publisher.makeBook();*/ this.invoke(); } //获取真实主题角色的所有方法,如果方法名为saleBook,完成上面的活儿,否则不管(反射机制) public void invoke() { Method[] methods=publisher.getClass().getMethods(); for(int i=0;i<methods.length;i++) { try { if(methods[i].getName().equals("saleBook")) { this.presaleBook(); methods[i].invoke(publisher); this.postsaleBook(); }else { methods[i].invoke(publisher); } } catch (IllegalAccessException e) { } catch (IllegalArgumentException e) { } catch (InvocationTargetException e) { } } } }
/20171030_chr_proxy/src/nuc/sw/proxy/TextProxy.java
package nuc.sw.proxy; public class TextProxy { public static void main(String[] args) { // TODO Auto-generated method stub ShoppingOnline so=new ShoppingOnline(); //so.saleBook(); so.invoke(); } }
相关文章推荐
- 如何使用Proxy模式及Java内建的动态代理机制
- 设计模式之五S:动态代理模式(Dynamic Proxy Pattern)
- 【设计模式】动态代理Proxy_01
- Proxy 代理模式 动态代理 CGLIB
- Java设计模式Proxy之动态代理
- Java动态代理模式(Proxy)实例
- java设计模式:动态代理模式 Proxy
- 设计模式之Proxy(代理):模拟JDK的动态代理
- Java设计模式-----Proxy模式(动态代理)
- 动态代理模式——Proxy
- [置顶] 轻松学,Java 中的代理模式(proxy)及动态代理
- 【设计模式】动态代理Proxy_02
- Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理
- Design Pattern—— Dynamic Proxy Pattern 动态代理模式
- 如何使用Proxy模式及Java内建的动态代理机制
- Java设计模式—Proxy动态代理模式
- 结构型模式之代理模式(Proxy 与 JDK动态代理)
- Java设计模式(七):代理模式Proxy(静态代理模式+动态代理模式)
- Java设计模式Proxy之动态代理
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()