码迷,mamicode.com
首页 > 编程语言 > 详细

java 代理模式

时间:2015-08-08 21:08:39      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

今天听代理模式的一点总结:

 

新建一个接口

package com.proxy;

public interface MoveAble {
    void move();
}

 

新建一个tank类 实现MoveAble

package com.proxy;

import java.util.Random;

public class Tank implements MoveAble{

    @Override
    public void move() {
        // TODO Auto-generated method stub
        System.out.println("坦克正在运行");
        try {
            new Thread().sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

 

要记录move这个方法的执行时间 我们有两种方法可以实现

 

 

package com.proxy;

/**
 * 通过继承的方式实现代理
 * 继承方式不灵活   如果要添加记录日志功能的时候 要新建一个类  继承tank2
 * 重写move 方法 在里面添加记录日志的功能   如果要添加n多个功能 要新建n多个类  产生
 * 类爆炸
 */
public class Tank2 extends Tank {
    
    /**
     * 要计算子类方法的执行时间
     */
    @Override
    public void move() {
        
        long start =System.currentTimeMillis();
        super.move();//tank2也是一个代理  调用他实际上调用的是他父类的方法
        long end  = System.currentTimeMillis();
        System.out.println("time:   "+(end-start));
    }

    
    
}

 

 

 

第二种方法    impl

 

package com.proxy;


/*
 * 一个类里面有另外一个类的实现  聚合
 */
public class TankLogProxy implements MoveAble{

    
    
    Tank t;//要测试的对象  这个对象的方法和 这个类的方法一样  调用别人的方法
    //TankLogProxy  是t 的一个代理
    public TankLogProxy(Tank t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        System.out.println("tank start");
        t.move();
        System.out.println("tank stop");
    }

}

 

 

测试

 

package com.proxy;

public class doMain {

    public static void main(String[] args) {
        
        MoveAble m = new Tank2();
        m.move();//调用的是他父类的方法

        MoveAble m1 = new TankTimeProxy(new Tank());
        m1.move();
    }
}

 

更推荐继承的方式进行实现

===================分割线=========================

 

如果想添加记录日志的功能  我们使用聚合的方式就比较简单灵活了

TankTimeProxy 修改如下

package com.proxy;

/*
 * 一个类里面有另外一个类的实现  聚合
 */
public class TankTimeProxy implements MoveAble{

    MoveAble t;

    public TankTimeProxy(MoveAble t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        // TODO Auto-generated method stub
        
        long start =System.currentTimeMillis();
        t.move();
        long end  = System.currentTimeMillis();
        System.out.println("time:   "+(end-start));
        
    }
}

添加  TankLogProxy

package com.proxy;


/*
 * 一个类里面有另外一个类的实现  聚合
 */
public class TankLogProxy implements MoveAble{

    
    
    MoveAble t;//   MoveAble 有 move 方法 可以代理所有MoveAble 的内容
    public TankLogProxy(MoveAble t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        System.out.println("tank start");
        t.move();
        System.out.println("tank stop");
    }

}

测试

package com.proxy;

public class doMain {

    public static void main(String[] args) {
        
        
//        Tank tank =new Tank();
//        TankTimeProxy ttp = new TankTimeProxy(tank);
//        MoveAble m = ttp;
//        m.move();//调用的是时间代理对象 内部调用的是   传进入的Tank tank =new Tank(); 对象的move 方法
        
        
        //如果我们要移动的时添加记录日志的功能
        Tank t =new Tank();
        TankTimeProxy tankTimeProxy  = new TankTimeProxy(t);
        TankLogProxy tankLogProxy = new TankLogProxy(tankTimeProxy);
        MoveAble m1 = tankLogProxy;
        m1.move();
        
    }
}

 

java 代理模式

标签:

原文地址:http://www.cnblogs.com/yaoyao66123/p/4713816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!