1. 程式人生 > >Java設計模式之代理模式的靜態代理和動態代理

Java設計模式之代理模式的靜態代理和動態代理

前言

代理模式分為靜態和動態。同時靜態代理又分為普通代理和強制代理。因此本文會通過示例的方式詳細介紹著三種代理模式。我們依然以網上購物為例。

 

普通代理

定義:要求客戶端只能訪問代理角色,而不能直接訪問真實角色。我們需要修改真實角色:

 1 public class RealConsumer implements IConsumer {
 2 
 3     private String name = null;
 4 
 5     public RealConsumer(IConsumer consumer, String name) throws Exception{
6 if(consumer == null) { 7 throw new Exception("不能建立真實角色"); 8 } 9 this.name = name; 10 } 11 12 @Override 13 public void login(String name, String password) { 14 System.out.println("登入使用者["+name+"]登陸成功"); 15 } 16 17 @Override
18 public void order() { 19 20 System.out.println("登入賬號:"+ this.name +"生成訂單成功"); 21 22 } 23 24 @Override 25 public void pay() { 26 27 System.out.println("登入賬號:"+ this.name +"訂單支付成功"); 28 29 } 30 }

第5行-10行:限制了誰能夠建立真實物件,同時傳遞登入賬號。

再來修改一下代理角色。程式碼圖如下所示:

 1 public class ProxyConsumer implements IConsumer {
 2 
 3     private IConsumer consumer = null;
 4 
 5     public ProxyConsumer(String name) {
 6         try {
 7             consumer = new RealConsumer(this, name);
 8         } catch (Exception e) {
 9 
10         }
11     }
12 
13     @Override
14     public void login(String name, String password) {
15         consumer.login(name, password);
16     }
17 
18     @Override
19     public void order() {
20         consumer.order();
21 
22     }
23 
24     @Override
25     public void pay() {
26         consumer.pay();
27     }
28 }

最後再修改一下場景類,能夠滿足場景類不再直接使用真實角色。

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4 
 5         IConsumer proxyCosumer = new ProxyConsumer("shujin");
 6 
 7         proxyCosumer.login("抒盡", "123456");
 8         proxyCosumer.order();
 9         proxyCosumer.pay();
10 
11     }
12 }

打印出來的結果如下圖所示:

1 登入使用者[抒盡]登陸成功
2 登入賬號:shujin生成訂單成功
3 登入賬號:shujin訂單支付成功

普通程式碼模式,呼叫者只需要知道代理,而不需要知道代理了誰,遮蔽了真實角色的暴露。真實角色的修改不會對高層產生任何的影響

 

強制代理

定義:強制代理和普通代理剛好相反。強制代理是通過真實角色找到代理角色。