欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

三、运行结果

java设计模式—静态代理模式(聚合与继承方式对比)

因为每个代理都实现了同一movable接口,代理和被代理对象之间都可以相互灵活转换,以实现代理功能之间的灵活叠加组合。

以上这篇java设计模式—静态代理模式(聚合与继承方式对比)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。