1. 程式人生 > >設計模式—靜態代理模式(聚合與繼承方式比較)

設計模式—靜態代理模式(聚合與繼承方式比較)

rri 技術分享 ktr sta too div ide rup 增加

一、概述

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

1 public interface Movable {
2     public void move();
3 }

2.Tank.java

技術分享
 1 import java.util.Random;
 2 
 3 public class Tank implements Movable {
 4 
 5     @Override
 6     public void move() {
 7         System.out.println("Tank moving.......");
 8         try {
 9             Thread.sleep(new Random().nextInt(5000));
10         } catch (InterruptedException e) {
11             e.printStackTrace();
12         }
13     }
14 
15 }
技術分享

3.TankTimeProxy.java

技術分享
 1 public class TankTimeProxy implements Movable {
 2 
 3     Movable m;
 4     
 5     public TankTimeProxy(Movable m) {
 6         this.m = m;
 7     }
 8 
 9     @Override
10     public void move() {
11         System.out.println("Time Proxy start...........");
12         long start = System.currentTimeMillis();
13         m.move();
14         long end = System.currentTimeMillis();
15         System.out.println("花費時間:"+(end - start));
16         System.out.println("Time Proxy end...........");
17     }
18 
19 }
技術分享

4.TankLogProxy.java

技術分享
 1 public class TankLogProxy implements Movable {
 2 
 3     Movable m;
 4     
 5     public TankLogProxy(Movable m) {
 6         this.m = m;
 7     }
 8 
 9     @Override
10     public void move() {
11         System.out.println("Log Proxy start...........");
12         m.move();
13         System.out.println("Log Proxy end...........");
14     }
15 
16 }
技術分享

5.Tank2Time.java

技術分享
 1 public class Tank2Time extends Tank {
 2 
 3     public void move(){
 4         System.out.println("Tank2 time  start...........");
 5         long start = System.currentTimeMillis();
 6         super.move();
 7         long end = System.currentTimeMillis();
 8         System.out.println("花費時間:"+(end - start));
 9         System.out.println("Tank2 time end...........");
10     }
11 }
技術分享

6.Tank3Log.java

技術分享
1 public class Tank3Log extends Tank2Time {
2 
3     public void move(){
4         System.out.println("Tank3Log  start...........");
5         super.move();
6         System.out.println("Tank3Log  end...........");
7     }
8 }
技術分享

7.Client.java

技術分享
 1 public class Client {
 2 
 3     @Test
 4     public void testProxy(){
 5         
 6         Tank t = new Tank();
 7         Movable m;
 8         
 9         //一、聚合的方式(較靈活,因為實現了接口)
10         //1.1聚合方式的代理,先日誌代理,後時間代理
11         TankTimeProxy ttp1 = new TankTimeProxy(t);
12         TankLogProxy tlp1 = new TankLogProxy(ttp1);
13         
14         m = tlp1;
15         m.move();
16         
17         System.out.println("\n==============================分隔線==========================\n");
18         
19         //1.2聚合方式的代理,先時間代理,後日誌代理(可以靈活切換順序)
20         TankLogProxy tlp2 = new TankLogProxy(t);
21         TankTimeProxy ttp2 = new TankTimeProxy(tlp2);
22         
23         m = ttp2;
24         m.move();
25         
26         System.out.println("\n==============================分隔線==========================\n");
27         
28         //二、繼承的方式
29         //2.1代理時間
30         Tank2Time t2 = new Tank2Time();
31         t2.move();
32         
33         System.out.println("\n==============================分隔線==========================\n");
34         
35         //2.2先代理日誌,後時間,不能靈活切換
36         Tank3Log t3 = new Tank3Log();
37         t3.move(); 
41     }
42 }
技術分享

三、運行結果

技術分享

因為每個代理都實現了同一movable接口,代理和被代理對象之間都可以相互靈活轉換,以實現代理功能之間的靈活疊加組合。

設計模式—靜態代理模式(聚合與繼承方式比較)