Java設計模式之代理模式的靜態代理和動態代理
阿新 • • 發佈:2018-11-29
前言
代理模式分為靜態和動態。同時靜態代理又分為普通代理和強制代理。因此本文會通過示例的方式詳細介紹著三種代理模式。我們依然以網上購物為例。
普通代理
定義:要求客戶端只能訪問代理角色,而不能直接訪問真實角色。我們需要修改真實角色:
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 @Override18 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訂單支付成功
普通程式碼模式,呼叫者只需要知道代理,而不需要知道代理了誰,遮蔽了真實角色的暴露。真實角色的修改不會對高層產生任何的影響
強制代理
定義:強制代理和普通代理剛好相反。強制代理是通過真實角色找到代理角色。