靜態代理設計模式:
要求:真實角色,代理角色;真實角色和代理角色要實現同一個接口,代理角色要持有真實角色的引用。
在Java中線程的設計就使用了靜態代理設計模式,其中自定義線程類實現Runable接口,Thread類也實現了Runalbe接口,在創建子線程的時候,傳入了自定義線程類的引用,再通過調用start()方法,調用自定義線程對象的run()方法。實現了線程的並發執行。
1 public class Test2 { 2
3 public static void main(String[] args) { 4 //Runnable實現類對象,真實角色
5 Thread1 role1 = new Thread1(); 6 //線程類代理角色,該類也實現了Runnable接口,代理角色
7 Thread thread1 = new Thread(role1);//傳入了真實角色的引用
8
9 thread1.start(); 10
11 } 12 } 13
14 class Thread1 implements Runnable { 15
16 @Override 17 public void run() { 18 //TODO
19 } 20
21 }
Thread對象調用線程的start()方法,在內部調用了真實角色的run()方法。
設計靜態代理模式
第一步,要有一個共同使用的接口
1 // 共同的接口
2 public interface Proxy { 3 public abstract void todo(); 4 }
代理角色和真實角色共同實現該接口,代理角色實現需要的功能。
1 // 真實角色
2 class RealityRole implements Proxy { 3
4 @Override 5 public void todo() { 6 System.out.println("真實角色的功能"); 7 } 8 } 9
10 // 代理角色
11 class ProxyRole implements Proxy { 12 // 持有代理角色的引用
13 private Proxy realityRole; 14
15 public ProxyRole() { 16
17 } 18
19 //傳入一個真實角色
20 public ProxyRole(Proxy role) { 21 realityRole = role; 22 } 23 @Override 24 public void todo() { 25 //在真實角色功能運行之前,代理角色做准備工作
26 doBefore(); 27 //執行真實角色的功能
28 realityRole.todo(); 29 //代理角色的收尾工作
30 doAfter(); 31 } 32 private void doBefore() { 33 System.out.println("准備工作"); 34 } 35 private void doAfter() { 36 System.out.println("收尾工作"); 37 } 38 }
創建真實角色的對象和代理角色的對象,並將真實角色對象的引用傳給代理角色,讓代理角色去執行功能。
1 public class Test { 2 public static void main(String[] args) { 3 //創建真實角色對象
4 Proxy realityRole = new RealityRole(); 5 //創建代理角色對象,並制定真實對象
6 ProxyRole proxyRole = new ProxyRole(realityRole); 7 //代理角色工作,本質調用的還是真實角色的功能
8 proxyRole.todo(); 9 } 10 }
運行結果:
准備工作
真實角色的功能
收尾工作