来源:http://www.bjsxt.com/
一、【GOF23设计模式】_代理模式、静态代理
package com.test.proxy.staticProxy; public interface Star { /** * 面谈 */ void confer(); /** * 签合同 */ void signConstract(); /** * 订票 */ void bookTicket(); /** * 唱歌 */ void sing(); /** * 收钱 */ void collectMoney(); }
1 package com.test.proxy.staticProxy; 2 3 public class RealStar implements Star{ 4 5 @Override 6 public void confer() { 7 System.out.println("RealStar.confer()"); 8 } 9 10 @Override 11 public void signConstract() { 12 System.out.println("RealStar.signConstract()"); 13 } 14 15 @Override 16 public void bookTicket() { 17 System.out.println("RealStar.bookTicket()"); 18 } 19 20 @Override 21 public void sing() { 22 System.out.println("RealStar(歌手本人).sing()"); 23 } 24 25 @Override 26 public void collectMoney() { 27 System.out.println("RealStar.collectMoney()"); 28 } 29 }
1 package com.test.proxy.staticProxy; 2 3 public class ProxyStar implements Star{ 4 private Star realStar; 5 6 7 public ProxyStar(Star realStar) { 8 super(); 9 this.realStar = realStar; 10 } 11 12 @Override 13 public void confer() { 14 System.out.println("ProxyStar.confer()"); 15 } 16 17 @Override 18 public void signConstract() { 19 System.out.println("ProxyStar.signConstract()"); 20 } 21 22 @Override 23 public void bookTicket() { 24 System.out.println("ProxyStar.bookTicket()"); 25 } 26 27 @Override 28 public void sing() { 29 realStar.sing(); 30 } 31 32 @Override 33 public void collectMoney() { 34 System.out.println("ProxyStar.collectMoney()"); 35 } 36 }
1 package com.test.proxy.staticProxy; 2 3 public class Client { 4 public static void main(String[] args) { 5 Star realStar = new RealStar(); 6 Star proxyStar = new ProxyStar(realStar); 7 8 proxyStar.confer(); 9 proxyStar.signConstract(); 10 proxyStar.bookTicket(); 11 proxyStar.sing(); 12 proxyStar.collectMoney(); 13 } 14 }
控制台输出:
ProxyStar.confer()
ProxyStar.signConstract()
ProxyStar.bookTicket()
RealStar(歌手本人).sing()
ProxyStar.collectMoney()
二、【GOF23设计模式】_代理模式、动态代理、开发中常见的场景
动态代理(动态生成代理类)
——JDK自带的动态代理
——javaassist字节码操作库实现
——CGLIB
——ASM(底层使用指令,可维护性较差)
动态代理相比于静态代理的优点
——抽象角色中(接口)声明的所有方法都被转移到调用处理器中一个集中的方法中处理,这样我们可以更加灵活和统一地处理众多的方法。
JDK自带的动态代理
——java.lang.reflect.Proxy
————作用:动态生成代理类和对象
——java.lang.reflect.InvocationHandler(处理器接口)
————可以通过invoke方法实现对真实角色的代理访问
————每次通过Proxy生成代理类对象时都要指定对应的处理器对象
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.sing();
1 package com.test.proxy.dynamicProxy; 2 3 public interface Star { 4 /** 5 * 面谈 6 */ 7 void confer(); 8 /** 9 * 签合同 10 */ 11 void signConstract(); 12 /** 13 * 订票 14 */ 15 void bookTicket(); 16 /** 17 * 唱歌 18 */ 19 void sing(); 20 /** 21 * 收钱 22 */ 23 void collectMoney(); 24 }
1 package com.test.proxy.dynamicProxy; 2 3 public class RealStar implements Star{ 4 5 @Override 6 public void confer() { 7 System.out.println("RealStar.confer()"); 8 } 9 10 @Override 11 public void signConstract() { 12 System.out.println("RealStar.signConstract()"); 13 } 14 15 @Override 16 public void bookTicket() { 17 System.out.println("RealStar.bookTicket()"); 18 } 19 20 @Override 21 public void sing() { 22 System.out.println("RealStar(歌手本人).sing()"); 23 } 24 25 @Override 26 public void collectMoney() { 27 System.out.println("RealStar.collectMoney()"); 28 } 29 }
1 package com.test.proxy.dynamicProxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler{ 7 private Star realStar; 8 9 public StarHandler(Star realStar) { 10 super(); 11 this.realStar = realStar; 12 } 13 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) 16 throws Throwable { 17 18 Object object = null; 19 20 System.out.println("真正的方法执行前"); 21 System.out.println("面谈,签合同,预付款,订机票"); 22 23 if(method.getName().equals("sing")){ 24 object = method.invoke(realStar, args); 25 } 26 27 System.out.println("真正的方法执行后"); 28 System.out.println("收尾款"); 29 30 return object; 31 } 32 }
1 package com.test.proxy.dynamicProxy; 2 3 import java.lang.reflect.Proxy; 4 5 public class Client { 6 public static void main(String[] args) { 7 Star realStar = new RealStar(); 8 StarHandler handler = new StarHandler(realStar); 9 10 Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); 11 12 proxy.sing(); 13 } 14 }
控制台输出:
真正的方法执行前
面谈,签合同,预付款,订机票
RealStar(歌手本人).sing()
真正的方法执行后
收尾款