java设计模式—静态代理模式(聚合与继承方式对比)
程序员文章站
2024-02-19 14:27:46
一、概述
1.目标:要在tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换
2.思路:
(1)聚合:代理类聚合...
一、概述
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(); } }
三、运行结果
因为每个代理都实现了同一movable接口,代理和被代理对象之间都可以相互灵活转换,以实现代理功能之间的灵活叠加组合。
以上这篇java设计模式—静态代理模式(聚合与继承方式对比)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: MySql存储过程学习知识小结