文章出處
文章列表
今天學習了一下代理模式,代理模式分為很多種。目前感覺有兩種是需要學習一下的。
- 靜態代理模式
- 動態代理模式
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 }
以上兩種模式的測試結果一致。
每天一點小進步,聚沙成塔-_-!!!
文章列表
全站熱搜