• 【GOF23设计模式】代理模式


    来源: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()
    真正的方法执行后
    收尾款
     
  • 相关阅读:
    C++奇数阶幻方(主动生成)
    一次C++作业 C++的I/O流类库 3 (学生注册信息登记程序)
    一次C++作业 C++的I/O流类库2 [文本文件和二进制文件]
    一次C++作业(模板类的构造& C++的I/O流类库)1
    一次C++作业 try-throw-catch
    关于英语作文AI批改的思考(含定向高分方案)
    PhoneNumber类
    一次C++作业
    服务器较全面入手介绍(持续更新)
    JS中多个onload冲突解决办法
  • 原文地址:https://www.cnblogs.com/erbing/p/5802464.html
Copyright © 2020-2023  润新知