posts - 68, comments - 19, trackbacks - 0, articles - 1

          簡單靜態(tài)代理與動(dòng)態(tài)代理

          Posted on 2011-01-29 14:58 viery 閱讀(156) 評論(0)  編輯  收藏 所屬分類: JavaSE

          靜態(tài):
          首先需要一個(gè)接口
          public interface Neting {

           public void netting();
           
           public String playGame(String name);
          }
          然后需要一個(gè)實(shí)例去繼承:

          public class NetImpl implements Neting {

           @Override
           public void netting() {
            System.out.println("上網(wǎng)中....");
           }

           @Override
           public String playGame(String name) {
            System.out.println("游戲中....");
            return "game over";
           }

          }

          最后需要一個(gè)同樣實(shí)現(xiàn)了相同接口的類來做代理,并在每個(gè)方法中加入需要的操作:

          public class NetingImplProxy implements Neting {

           private Neting neting;
           
           public NetingImplProxy(Neting neting){
            this.neting=neting;
           }
           @Override
           public void netting() {
            this.up();
            neting.netting();
            this.down();
           }

           @Override
           public String playGame(String name) {
            this.up();
            String str=neting.playGame(name);
            this.down();
            return str;
           }
           
           private void up(){
            System.out.println("撥號中");
           }
           
           private void down(){
            System.out.println("斷開中");
           }

          }

          這樣產(chǎn)生的結(jié)果是每次更改方法中固定的操作時(shí),都需要更改類的源代碼,帶來很多不便,由此產(chǎn)生動(dòng)態(tài)代理。
          動(dòng)態(tài)代理需要一個(gè)Proxy類和invocationhandle接口來支持:

          同樣,上述的接口和實(shí)現(xiàn)類都不變,不再需要代理類,而是由下面這個(gè)類動(dòng)態(tài)產(chǎn)生:
          public class NetHandle implements InvocationHandler {
           
           //首先需要傳一個(gè)目標(biāo)對象的引用
           private Object targetObject;
           
          //設(shè)置構(gòu)造方法時(shí),直接將目標(biāo)對象作為參數(shù)傳入
           public NetHandle(Object targetObject){
            this.targetObject=targetObject;
           }
           
           //這是至關(guān)重要的,由此類實(shí)例的本方法產(chǎn)生一個(gè)$...代理對象:
           public Object createProxyInstance(){
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                     targetObject.getClass().getInterfaces(),
                     this);
            
           }
          //代理對象會(huì)自動(dòng)調(diào)用復(fù)寫后的invoke方法,類似filter中的dofilter;
           @Override
           public Object invoke(Object proxy, Method method, Object[] args)
             throws Throwable {
            up(); //在此加入需要增加的操作
            Object ret=method.invoke(targetObject, args);
            down();//在此加入需要增加的操作
            return ret;// 如果沒有返回值,則返回null。
           }
           
           private void up(){
            System.out.println("撥號中");
           }
           
           private void down(){
            System.out.println("斷開中");
           }
          }
          測試:
           public static void main(String[] args) {
            
            NetHandle n=new NetHandle(new NetImpl());
            Neting net=(Neting) n.createProxyInstance();
            net.netting();
            System.out.println(net.playGame(""));
           }
          運(yùn)行結(jié)果:
          撥號中
          上網(wǎng)中....
          斷開中
          撥號中
          游戲中....
          斷開中
          game over

          主站蜘蛛池模板: 盐城市| 铁岭县| 和硕县| 讷河市| 塔城市| 东阿县| 阳谷县| 县级市| 左贡县| 北京市| 云和县| 临桂县| 临夏市| 特克斯县| 阜宁县| 萍乡市| 修武县| 新泰市| 方正县| 杭锦后旗| 阿城市| 大兴区| 甘孜县| 巨野县| 兴化市| 桃园市| 习水县| 利辛县| 塔城市| 肥城市| 永仁县| 明水县| 广汉市| 额济纳旗| 离岛区| 左权县| 麻城市| 罗江县| 祥云县| 左贡县| 万山特区|