1. 程式人生 > >(@WhiteTaken)設計模式學習——代理模式

(@WhiteTaken)設計模式學習——代理模式

imp 模式 ati lan public eth object 靜態代理 out

今天學習了一下代理模式,代理模式分為很多種。目前感覺有兩種是需要學習一下的。

  • 靜態代理模式
  • 動態代理模式

1. 靜態代理模式

  需要被代理的類,實現一個或者多個接口。

  代理類需要實現被代理類的接口,在此時就可以對這個接口中的方法進行一些操作。

  還是直接上代碼吧。

IPerson接口類。

1 public interface IPerson { 2 public void buyHouse(); 3 }

Man類,實現buyHouse方法。

1 public class Man implements IPerson {
2     @Override
3     public
void buyHouse() { 4 System.out.println("準備買房了,然而錢並不夠"); 5 } 6 }

PersonProxy類,實現IPerson接口,同時在不修改man對象中的方法的情況下,對man的buyHouse方法進行了修飾。

 1 import java.nio.channels.NonWritableChannelException;
 2 
 3 public class PersonProxy implements IPerson {
 4     private Man man;
 5 
 6     public void
setMan(Man man) { 7 this.man = man; 8 } 9 10 @Override 11 public void buyHouse() { 12 if(null == man){ 13 man = new Man(); 14 } 15 man.buyHouse(); 16 watch(); 17 speak(); 18 } 19 20 private void speak(){ 21 System.out
.println("代理砍價=======一頓吆喝"); 22 } 23 24 private void watch(){ 25 System.out.println("-----帶著看房--------"); 26 } 27 }

測試類。

1 public class MainClass {
2     public static void main(String[] args) {
3         PersonProxy personProxy = new PersonProxy();
4         personProxy.buyHouse();
5     }
6 }

2. 動態代理模式

動態代理模式,不同於靜態代理模式的地方,是不用去實現被代理類的接口,降低了修改接口後的維護代價,Java中JDK有相關的接口實現。

具體代碼如下。

IPerson接口類和Man類保留。

MyHander類,對代理這件事進行了操作。核心就是method.invoke方法。

 1 package com.whitetaken.test;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 public class MyHandler implements InvocationHandler {
 7     private Man man;
 8     
 9     public void setMan(Man man) {
10         this.man = man;
11     }
12     @Override
13     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
14         Object result = null;
15         if(null == man){
16             man = new Man();
17         }
18         result = method.invoke(man, args);
19         speak();
20         watch();
21         return result;
22     }
23     
24     private void speak(){
25         System.out.println("代理砍價=======一頓吆喝");
26     }
27     
28     private void watch(){
29         System.out.println("-----帶著看房--------");
30     }
31 }

測試類。

 1 package com.whitetaken.test;
 2 
 3 import java.lang.reflect.Proxy;
 4 
 5 public class MainClass {
 6     public static void main(String[] args) {
 7         Man man = new Man();
 8         MyHandler myHandler = new MyHandler();
 9         myHandler.setMan(man);
10         IPerson person = (IPerson)Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), myHandler);
11         person.buyHouse();
12     }
13 }

以上兩種模式的測試結果一致。

技術分享

每天一點小進步,聚沙成塔-_-!!!

(@WhiteTaken)設計模式學習——代理模式