Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

时间:2023-03-08 23:25:15
Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

一、概述

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(); }
}

三、运行结果

Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

四、小结

凡是要求灵活多变的功能,多数用接口多态实现