動態代理模式

lanchengxiaoxiao發表於2012-04-21
package 動態代理模式;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
*所有行業代理商
*有了它我們的客戶可以通過他買個各種產品
*/

public class AllthingsProxy implements InvocationHandler{

    private Logger logger=
            Logger.getLogger(this.getClass().getName());
        
        private Object allthings;
    
      //實現物件繫結
        public Object bind(Object allthings){
            
            this.allthings = allthings;
            
            //這裡傳入newProxyInstance的引數分別是 目標object
            //(Lianxiang,Sanxing),interface(Computer),AllthingsProxy
            return Proxy.newProxyInstance(allthings.getClass().getClassLoader(),
                                        allthings.getClass().getInterfaces(), this);
        }
    
        
    @Override
      public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            
            Object result = null;
            
            try{
            log("method starts " + method);
            
            result=method.invoke(allthings, args);

            logger.log(Level.INFO , "method ends " + method);
            
            }catch(Exception e){
                log(e.toString());
            }
            
            return result;
        }

    private void log(String msg){
        logger.log(Level.INFO,msg);
    }

}

-----------------------------

package 動態代理模式;

/*
*汽車批發商
*這樣我們的程式碼中就有了電腦和汽車這兩個批發商
*/

public interface Car {
    public void buyCar(String name);
}


------------------------

package 動態代理模式;

/**
 * 勞斯萊斯產品
 * @author Administrator
 *
 */
public class RollsRoyce implements Car{

     public void buyCar(String name) {
            
            System.out.println(name+"   公司:|勞斯萊斯公司!");
        }

}


------------------------

package 動態代理模式;


/*
*三個客戶兩個買電腦一個買汽車
*他們找到同個代理商
*/

public class Buything {
  public static void main(String args[]){
      AllthingsProxy allthingsproxy = new AllthingsProxy();
      Computer lenovoProxy=(Computer)allthingsproxy.bind(new Lenovo());
      
      lenovoProxy.buyComputer("我想買一臺聯想電腦");
      /*
      Computer SanxingProxy=(Computer)allthingsproxy.bind(new Sanxing());
      
      SanxingProxy.buyComputer("我想買一臺三星電腦");
      
      */
      Car rRollsRoyceProxy=(Car)allthingsproxy.bind(new RollsRoyce());
      
      rRollsRoyceProxy.buyCar("我想買一輛勞斯萊斯汽車");
  }
}


------------------------

package 動態代理模式;

/*
*汽車批發商
*這樣我們的程式碼中就有了電腦和汽車這兩個批發商
*/
public interface Computer {
    public void buyComputer(String name);
}


------------------------

package 動態代理模式;

public class Lenovo implements Computer{

    @Override
    public void buyComputer(String name) {
         System.out.println(name+"   公司: |聯想!");
    }

}


------------------------

------------------------


相關文章