zoukankan      html  css  js  c++  java
  • 设计模式之代理模式的静态代理和动态代理

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。

    以下是代码实现:

    package com.porxy;
    
    /**
     *  定义一个抽象类,含有一个抽象方法
     */
    public abstract class Subject {
        public  abstract  void Request();
    }
    
    
    /**
     * 一个真实的类,被代理的对象
     */
    public class RealSubject extends Subject {
        @Override
        public void Request() {
            System.out.println("真实的请求");
        }
    }
    
    
    /**
     * 代理类,其中含有一个对象的引用
     */
    public class Proxy extends  Subject {
        RealSubject realSubject ;
    
        @Override
        public void Request() {
            if (realSubject == null){
                realSubject = new RealSubject();
            }
            realSubject.Request();
        }
    }
    
    
    /**
     *客户端,通过调用代理对象,而实现真实类的方法
     */
    public class ProxyMain {
        public static void main(String[] args) {
            Proxy px = new Proxy();
            px.Request();
        }
    }

    动态代理,底层应该就是封装了上面的代码,传入三个参数(类的加载,接口,代理对象)

    InvocationHandler注释翻译: 调用处理程序是由代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用被编码并发送到调用处理程序的调用方法

    package com.porxy;
    
    /**
     * 声明一个接口,含有一个方法
     */
    public interface Subject {
         void Request();
    }
    
    
    package com.porxy;
    
    /**
     * 实现类,也就是被代理的类,实现这个方法
     */
    public class RealSubject implements Subject {
        @Override
        public void Request() {
            System.out.println("一辆豪车启动");
        }
    }

    以下是动态代理类

    
    
    package com.porxy;

    import java.lang.reflect.*;
    import java.lang.reflect.Proxy;

    /**
    * 先创建一个被代理的对象
    *
    */
    public class DynamicProxy {

    public static void main(String[] args) {

    final RealSubject realSubject = new RealSubject();

    Subject instance = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
    new Class[]{Subject.class}, new InvocationHandler() {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //                        if ("Request".equals(method.getName())) {
    //
    // System.out.println("豪车加速");
    //
    // Object obj = method.invoke(realSubject, args);
    //
    // System.out.println("3秒破百");
    // return obj;
    //
    // }

    Object obj = method.invoke(realSubject, args);
    return obj;

    }
    });
    instance.Request();
    }


    }
     /* 输出为:

         豪车加速
        一辆豪车启动
        3秒破百    */

        
  • 相关阅读:
    POJ-2253 Frogger dijsktra查找间隔最小的路径
    LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法
    LightOJ-1341 Aladdin and the Flying Carpet 分解质因数(注意对大素数的优化)
    UVA-10200 Prime Time 素数(注意除法精度)
    POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)
    ArchLinux 音乐播放客户端ncmpcpp和服务端mpd的配置
    [笔记-统计学习方法]感知机模型(perceptron) 原理与实现
    [Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact
    [Bug]C++ XXX:undefined reference to "xxx"
    ip代理池的爬虫编写、验证和维护
  • 原文地址:https://www.cnblogs.com/JavaBlackHole/p/7667843.html
Copyright © 2011-2022 走看看