zoukankan      html  css  js  c++  java
  • 代理模式

    静态代理模式

      1 package com.java.proxy;
      2 
      3 /**
      4  * 代理模式
      5  * 
      6  */
      7 public class ProxyTest {
      8     public static void main(String[] args) {
      9         CoalBossProxy cbp = new CoalBossProxy();
     10         cbp.meet();
     11         cbp.consume();
     12 
     13         SteelBossProxy sbp = new SteelBossProxy();
     14         sbp.meet();
     15         sbp.consume();
     16     }
     17 }
     18 
     19 interface Boss {
     20 
     21     public void meet();
     22 
     23     public void consume();
     24 
     25 }
     26 
     27 //被代理类
     28 class CoalBoss implements Boss {
     29 
     30     @Override
     31     public void meet() {
     32         System.out.println("与煤老板见面");
     33     }
     34 
     35     @Override
     36     public void consume() {
     37         System.out.println("让煤老板消费");
     38     }
     39 
     40 }
     41 
     42 //代理类
     43 class CoalBossProxy implements Boss {
     44 
     45     private CoalBoss cb;
     46 
     47     public CoalBossProxy() {
     48         cb = new CoalBoss();
     49     }
     50 
     51     @Override
     52     public void meet() {
     53         System.out.println("-----------代理开始-----------");
     54         cb.meet();
     55         System.out.println("-----------代理结束-----------");
     56     }
     57 
     58     @Override
     59     public void consume() {
     60         System.out.println("-----------代理开始-----------");
     61         cb.consume();
     62         System.out.println("-----------代理结束-----------");
     63     }
     64 
     65 }
     66 
     67 class SteelBoss implements Boss {
     68 
     69     @Override
     70     public void meet() {
     71         System.out.println("与钢铁老板见面");
     72     }
     73 
     74     @Override
     75     public void consume() {
     76         System.out.println("让钢铁老板消费");
     77     }
     78 
     79 }
     80 
     81 class SteelBossProxy implements Boss {
     82 
     83     private SteelBoss sb;
     84 
     85     public SteelBossProxy() {
     86         sb = new SteelBoss();
     87     }
     88 
     89     @Override
     90     public void meet() {
     91         System.out.println("-----------代理开始-----------");
     92         sb.meet();
     93         System.out.println("-----------代理结束-----------");
     94     }
     95 
     96     @Override
     97     public void consume() {
     98         System.out.println("-----------代理开始-----------");
     99         sb.consume();
    100         System.out.println("-----------代理结束-----------");
    101     }
    102 }

    动态代理模式

     1 package com.java.proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 /**
     8  * 动态代理模式
     9  * 动态代理:需要实现 java.lang.reflect.InvocationHandler; 接口
    10  * 
    11  * public Object invoke(Object proxy, Method method, Object[] args)
    12  * 
    13  * proxy : 传递的是动态生成的代理对象
    14  * method : 需要执行方法的 Method 的实例
    15  * args : method.invoke() 需要的实际参数值
    16  */
    17 public class DynamicProxyTest {
    18     public static void main(String[] args) {
    19         DynamicProxyHandler dph = new DynamicProxyHandler();
    20         Boss cb = (Boss) dph.newProxyInstance(new CoalBoss());
    21         cb.meet();
    22         cb.consume();
    23 
    24         Boss sb = (Boss) dph.newProxyInstance(new SteelBoss());
    25         sb.meet();
    26         sb.consume();
    27     }
    28 }
    29 
    30 class DynamicProxyHandler implements InvocationHandler {
    31 
    32     // 目标对象
    33     private Object target;
    34 
    35     // 生成动态代理对象
    36     public Object newProxyInstance(Object target) {
    37         this.target = target;
    38 
    39         /*
    40          * 第一个参数:通常与目标对象的类加载器一致。(目标对象由哪个类加载器加载,动态代理类就由哪个类加载器加载)
    41          * 第二个参数:通常与目标对象实现的接口保持一致。(实现了哪些接口,就相当于有哪些方法)
    42          * 第三个参数:需要实现了 InvocationHandler 接口实现类的实例。(目的执行该接口中的 invoke() 方法)
    43          *             invoke 动态执行目标对象的方法(Method实例)
    44          */
    45         return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    46     }
    47 
    48     @Override
    49     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    50         System.out.println("-----------代理开始-----------");
    51 
    52         Object obj = method.invoke(target);
    53 
    54         System.out.println("-----------代理结束-----------");
    55 
    56         return obj;
    57     }
    58 
    59 }
  • 相关阅读:
    11gR2新特性:STANDBY_MAX_DATA_DELAY
    ASM file metadata operation等待事件
    Slide:配置GoldenGate同步DDL语句
    C++中Static作用和使用方法
    LPARAM类型转化为CString类型
    Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
    C++ inline函数 介绍
    C++ 注册表编程
    C++中L和_T()之区别
    枚举的访问方式
  • 原文地址:https://www.cnblogs.com/yonxin/p/12554848.html
Copyright © 2011-2022 走看看