一、概述
1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换
2.思路:
(1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码
(2)继承:继承不够灵活,具体看代码
二、代码
1.Movable.java
2.Tank.java
3.TankTimeProxy.java
4.TankLogProxy.java
5.Tank2Time.java
6.Tank3Log.java
7.Client.java
1.Movable.java
public interface Movable {
public void move();
}
2.Tank.java
import java.util.Random; public class Tank implements Movable { @Override
public void move() {
System.out.println("Tank moving.......");
try {
Thread.sleep(new Random().nextInt(5000));
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
3.TankTimeProxy.java
public class TankTimeProxy implements Movable { Movable m; public TankTimeProxy(Movable m) {
this.m = m;
} @Override
public void move() {
System.out.println("Time Proxy start...........");
long start = System.currentTimeMillis();
m.move();
long end = System.currentTimeMillis();
System.out.println("花费时间:"+(end - start));
System.out.println("Time Proxy end...........");
} }
4.TankLogProxy.java
public class TankLogProxy implements Movable { Movable m; public TankLogProxy(Movable m) {
this.m = m;
} @Override
public void move() {
System.out.println("Log Proxy start...........");
m.move();
System.out.println("Log Proxy end...........");
} }
5.Tank2Time.java
public class Tank2Time extends Tank { public void move(){
System.out.println("Tank2 time start...........");
long start = System.currentTimeMillis();
super.move();
long end = System.currentTimeMillis();
System.out.println("花费时间:"+(end - start));
System.out.println("Tank2 time end...........");
}
}
6.Tank3Log.java
public class Tank3Log extends Tank2Time { public void move(){
System.out.println("Tank3Log start...........");
super.move();
System.out.println("Tank3Log end...........");
}
}
7.Client.java
public class Client { @Test
public void testProxy(){ Tank t = new Tank();
Movable m; //一、聚合的方式(较灵活,因为实现了接口)
//1.1聚合方式的代理,先日志代理,后时间代理
TankTimeProxy ttp1 = new TankTimeProxy(t);
TankLogProxy tlp1 = new TankLogProxy(ttp1); m = tlp1;
m.move(); System.out.println("\n==============================分隔线==========================\n"); //1.2聚合方式的代理,先时间代理,后日志代理(可以灵活切换顺序)
TankLogProxy tlp2 = new TankLogProxy(t);
TankTimeProxy ttp2 = new TankTimeProxy(tlp2); m = ttp2;
m.move(); System.out.println("\n==============================分隔线==========================\n"); //二、继承的方式
//2.1代理时间
Tank2Time t2 = new Tank2Time();
t2.move(); System.out.println("\n==============================分隔线==========================\n"); //2.2先代理日志,后时间,不能灵活切换
Tank3Log t3 = new Tank3Log();
t3.move(); }
}
三、运行结果
四、小结
凡是要求灵活多变的功能,多数用接口多态实现