ErBing

往事已经定格,未来还要继续。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

来源: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()

UML

二、【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()
真正的方法执行后
收尾款
 
posted on 2016-08-24 12:41  ErBing  阅读(220)  评论(0编辑  收藏  举报