代理模式

来源:互联网 发布:扣压高压油管算法数据 编辑:程序博客网 时间:2024/06/07 19:20

代理模式

静态代理

继承方式实现

public interface Moveable {    void move();}
public class Car implements Moveable {    @Override    public void move() {        // 实现开车        try {            System.out.println("汽车行驶中...");            Thread.sleep(new Random().nextInt(1000));        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
public class Car2 extends Car {    @Override    public void move() {        long startTime = System.currentTimeMillis();        System.out.println("汽车开始行驶");        super.move();        long endTime = System.currentTimeMillis();        System.out.println("结束行驶,行驶了"+(endTime-startTime)+"ms");    }}
public static void main(String[] args) {            Car2 car2 = new Car2();        car2.move();    }

聚合方式实现

public class Car3 implements Moveable {    private Car car;    public Car3(Car car) {        super();        this.car = car;    }    @Override    public void move() {        long startTime = System.currentTimeMillis();        System.out.println("汽车开始行驶");        car.move();        long endTime = System.currentTimeMillis();        System.out.println("结束行驶,行驶了" + (endTime - startTime) + "ms");    }}
public static void main(String[] args) {        Car car = new Car();        Moveable m = new Car3(car);        m.move();    }

这里写图片描述

jdk动态代理

public class TimeHandler implements InvocationHandler {    private Object target;    public TimeHandler(Object target) {        super();        this.target = target;    }    /**     * @param proxy 被代理的对象     * @param method 被代理对象的方法     * @param args 方法的参数     * @return Object 方法的返回值     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        long startTime = System.currentTimeMillis();        System.out.println("汽车开始行驶");        method.invoke(target);        long endTime = System.currentTimeMillis();        System.out.println("结束行驶,行驶了"+(endTime-startTime)+"ms");        return null;    }}
public static void main(String[] args) {        Car car = new Car();        InvocationHandler h = new TimeHandler(car);        Class<?> c = car.getClass();        Moveable m = (Moveable) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), h);        m.move();    }
0 0