设计模式:代理模式(Proxy)

本文详细介绍了代理模式的概念及其在Java中的实现。通过具体的编程示例,展示了如何利用静态代理和动态代理来扩展对象的功能,同时保持代码的整洁和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      代理模式提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.同时减少对原有代码的入侵。

      

/**
 * @Author : haojiangt
 * @Description :Coder 程序员接口有编程这一个方法
 **/
public interface Coder {
    void programing();
}

/**
 * @Author : haojiangt
 * @Description :Java程序员实现Coder接口,实现programing方法
 **/
public class JavaCoder implements Coder{
    @Override
    public void programing() {
        System.out.println("I am programing by Java");
    }
}

-------------------------------------我是华丽的分割线---------------------------------------------------------------

/**
 * @Author : haojiangt
 * @Description :静态代理
 *                   
 **/
public class ProxyCoder implements Coder{
   /**
     * 重载构造函数
     * 在实例化ProxyCoder时,注入一个Coder
     * @param coder
     */
    public ProxyCoder(Coder coder) {
        this.coder = coder;
    }

    /**
     * ProxyCoder具体代理programing的方式
     * 可以在被代理的方法执行前,执行后加入一些操作,同时又不会对之造成代码入侵
     */
    @Override
    public void programing() {
        System.out.println("I will program.");
        coder.programing();
        System.out.println("I have finished programing");
    }
    public static void main(String[] args){
        //实例化一个代理类,有代理类来执行这个方法
        Coder javaCoder = new JavaCoder();
        Coder proxyCoder = new ProxyCoder(javaCoder);
        proxyCoder.programing();

    }
}

-------------------------------------我是华丽的分割线---------------------------------------------------------------

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author : haojiangt
 * @Description :动态代理1.0
 * 我们不需要在手动去为每一个动作创建代理类,只需要创建一个动态处理器,实现InvocationHandler接口,重写invoke()方法
 * 完成之后只需要在使用时注入,就可以由jdk来为我们创建代理。
 **/
public class CoderBynamicProxy implements InvocationHandler{
    private Object object;

    public CoderDynamicProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("I will program.");
        Object result = method.invoke(object, args);
        System.out.println("I have finished programing");
        return result;
    }

    public static void main(String[] args){
        InvocationHandler coderBynamicProxy = new CoderDynamicProxy(new JavaCoder());

        Coder coder = (Coder) Proxy.newProxyInstance(new JavaCoder().getClass().getClassLoader(),
                new JavaCoder().getClass().getInterfaces(), coderBynamicProxy);
        coder.programing();

    }
}

-------------------------------------我是华丽的分割线---------------------------------------------------------------

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author : haojiangt
 * @Description : 动态代理2.0 我们将上面的代码进行整理,使得在产生代理是更加简洁。
 *                由原来的三个参数变为下面的一个参数,
 *                我自己是真机智-_-
 **/
public class ProxyFactory {
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("开始执行");
                        Object returnObject = method.invoke(target, args);
                        System.out.println("执行结束");
                        return null;
                    }
                });

    }

    public static void main(String[] args) {

        Coder javaCoder = (Coder) new ProxyFactory(new JavaCoder()).getProxyInstance();
        javaCoder.programing();

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值