静态代理之通过实现接口来实现代理

本文介绍了一种不修改原有代码即可扩展功能的方法——静态代理模式。通过实例演示如何为汽车行驶的功能增加时间计算与日志记录,展示了静态代理的灵活性。

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

package com.jason.staticProxy;

/**
 * @author jason
 * @Description: 定义一个汽车的接口,里面包含行驶的接口
 * @date 2018/2/2
 */
public interface Car {

    //里面定义一个行驶的方法
    public void run() throws Exception;
}
package com.jason.staticProxy;

import com.jason.ex.thread.ThreadDemo;

import java.util.Random;

/**
 * @author jason
 * @Description: 一个实现了汽车的接口的类,并且里面实现了行驶的方法
 * @date 2018/2/2
 *
 *    这里有一个需求,想计算我们班汽车行驶的时间,因为JAVA程序我们遵循OCP(对扩展开放,对修改关闭)原则,所以为了不修改原来代码,
 *    //我们来采用静态代理模式:
 *
 */
public class Baoma implements Car {

    //实现行驶的方法
    @Override
    public void run() throws  Exception{
        //里面使用了使当前线程睡眠的方法,休眠若干秒
        Thread.sleep(new Random().nextInt(1000));
        System.out.println("奥迪汽车行驶结束...");
    }
}
package com.jason.staticProxy;

/**
 * @author jason
 * @Description: 使用静态代理的方式来实现我们需求,得到汽车行驶的时间
 * @date 2018/2/2
 */
public class TimeProxy implements Car{

    //将需要代理的对象注入到我们的代理类中,将其变为我们自己的一个属性
    private Car car;

    //提供构造器,并且在初始化对象的时候,就将属性赋上
    public TimeProxy(Car car){
        this.car = car;
    }


    //实现我们汽车行驶的方法
    @Override
    public void run() throws Exception {
        //记录汽车行驶之间的时间
        long start = System.currentTimeMillis();
        //执行汽车行驶的方法
        car.run();
        //记录汽车行驶结束的时间
        long end = System.currentTimeMillis();
        //得到汽车行驶的时间
        System.out.println("汽车行驶的时间" + (end-start));
    }
}

package com.jason.staticProxy;

/**
 * @author jason
 * @Description: 这里新增了一个需求,不仅仅想要计算汽车行驶的时间,还需要在汽车行驶前后分别打印一下日志
 *               因为我们的代码设计是尽可能动源码,所以不能再原来的时间代理类中继续写代码
 *               而是需要再定义一个类去代理日志
 * @date 2018/2/2
 */
public class LogProxy implements Car {
    //1:将需要代理的对象注入进来
    private Car car;

    //2:提供构造器
    public LogProxy(Car car){
        this.car = car;
    }

    //实现我们的行驶方法
    //里面完成代理
    @Override
    public void run() throws Exception {
        //模拟打印日志操作------在汽车行驶之前打印日志
        System.out.println("汽车开始行驶...");
        //调用被代理目标的方法,开始执行
        car.run();
        //模拟打印日志操作------在汽车结束之后打印日志
        System.out.println("汽车结束行驶...");
    }
}

package com.jason.staticProxy;

import java.sql.Time;

/**
 * @author jason
 * @Description: 测试静态代理类是否有用
 * @date 2018/2/2
 */
public class Test {
    public static void main(String[] args) throws Exception{
//-----------------------------------------------------------------------------------------
        //仅仅代理时间的测试方法
        //初始化汽车对象
        Baoma baoma = new Baoma();
        //初始化代理类
        TimeProxy timeProxy = new TimeProxy(baoma);
        //执行汽车行驶的方法
        timeProxy.run();
//------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------
        //测试同时代理时间和日志,这里先计算时间,再打印日志
        //初始化汽车对象
        Baoma baoma1 = new Baoma();
        //初始化时间代理类
        TimeProxy timeProxy1 = new TimeProxy(baoma1);
        //初始化日志代理类
        LogProxy logProxy1 = new LogProxy(timeProxy1);
        //开始执行
        logProxy1.run();
//------------------------------------------------------------------------------------------
        //并且我们两个代理类的顺序可以随便指定,这里先打印日志,再计算时间
        //测试同时代理时间和日志
        //初始化汽车对象
        Baoma baoma2 = new Baoma();
        //初始化日志代理类
        LogProxy logProx2 = new LogProxy(timeProxy1);
        //初始化时间代理类
        TimeProxy timeProxy2 = new TimeProxy(baoma1);
        //开始执行
        timeProxy2.run();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值