一、概述
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设计模式—静态代理模式(聚合与继承方式对比)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍Java设计模式之静态代理模式实例分析,包括了Java设计模式之静态代理模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之静态代理模式。分享给大家供大家参考,具体如下: 代理模式,可以通过代理可以在原来的基础上附加一些其他的操作。静态代理模式相对比较简单无需再程序运行时动态的进行代理。 静态代理模式的角色: ① 抽象角色:真实对象和代理对象的共同接
介绍 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 代理模式使得代理对象控制具体对象的引用。代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西。 正文 我们来举一个简单的例子,假如dudu要送酸奶小妹玫瑰花,却不知道她的联系方式或者不好意思,想委托大叔去送这些玫瑰,那大叔就是个代理(其实
本文向大家介绍C++设计模式之代理模式,包括了C++设计模式之代理模式的使用技巧和注意事项,需要的朋友参考一下 前言 青春总是那样,逝去了才开始回味;大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光。大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了;还好,后来搞了一个游戏代理,总算能勉勉强强的玩了两年。时至今日,敲起键盘写设计模式的时候,又想起了那些美好
代理(Proxy) Intent 控制对其它对象的访问。 Class Diagram 代理有以下四类: 远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象,它可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,
本文向大家介绍Java设计模式之动态代理模式实例分析,包括了Java设计模式之动态代理模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之动态代理模式。分享给大家供大家参考,具体如下: 前面介绍了静态代理模式,动态代理比静态代理模式更加强大。它能在程序运行时动态的生成代理对象。所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给
本文向大家介绍java设计模式-代理模式(实例讲解),包括了java设计模式-代理模式(实例讲解)的使用技巧和注意事项,需要的朋友参考一下 代理模式是java最常见的设计模式之一。spring的aop就是使用了代理模式。 一般而言,代理模式分为静态代理和动态代理两种。 作为结构类的设计模式,作用在于不修改类内部代码的情况下,对类进行拓展,是对继承机制的一种补充。 eg :下面就用户登录这个例子实现