MENU

Catalog

    设计模式——动态代理

    September 11, 2018 • Read: 172 • 设计模式

    先写一个小程序,打印一句话"Moving",然后让主线程sleep10000毫秒以内的一个随机值

    //Moveable接口
    public interface Moveable {
        public void move();
    }
    //Tank类
    import java.util.Random;
    
    public class Tank implements Moveable{
    
        @Override
        public void move() {
            System.out.println("Tank Moving...");
            try {
                Thread.sleep(new Random().nextInt(10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    下面记录一下Tank类执行的时间,用到System.currentTimeMills()方法

    //Tank类
    import java.util.Random;
    
    public class Tank implements Moveable{
    
        @Override
        public void move() {
            long start = System.currentTimeMillis();
            System.out.println("Tank Moving...");
            try {
                Thread.sleep(new Random().nextInt(10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            long end = System.currentTimeMillis();
            System.out.println("Time:" + (end - start));
        }
    }

    实际上这还并不是达到要求的方法,要求的是记录整个Tank类中move方法的运行时间(很明显,这记录的只是move方法一部分的运行时间),要想记录很简单,设置一个代理,由这个代理访问Tank的move方法,然后在这个move方法的上下用System.currentTimeMilis()包裹。
    设置代理又分两种方法,一种是通过继承,继承这个Tank类,然后调用move方法。另一种是通过实现Moveable接口,但是获得Tank类的对象,然后通过这个对象访问Tank的move方法
    先说第一种方法

    //Tank2继承Tank类
    public class Tank2 extends Tank{
    
        @Override
        public void move() {
            long start = System.currentTimeMillis();
            super.move();
            long end = System.currentTimeMillis();
            System.out.println("Time:" + (end - start));
        }    
    }

    第二种方法

    //Tank3实现Moveable接口
    public class Tank3 implements Moveable{
        Tank t;
        Tank3(Tank t) {
            super();
            this.t = t;
        }
        @Override
        public void move() {
            long start = System.currentTimeMillis();
            t.move();
            long end = System.currentTimeMillis();
            System.out.println("Time:" + (end - start));
        }
    }

    上面第一种方法,叫继承,第二种方法,叫聚合

    Archives Tip
    QR Code for this page
    Tipping QR Code
    Leave a Comment

    已有 1 条评论
    1. chuxiang chuxiang

      大佬666