代理模式中的兩種代理:靜態代理和動態代理

 

//靜態代理模式

//其實這個可以是個接口,房地產開發商

public abstract class Subject

{

       public abstract void request();

}

 

//購房的房主,真實對象

public class RealSubject extends Subject

{

       public void request()

       {

              System.out.println("From real subject.");

       }

}

 

//代理對象,中介

public class ProxySubject extends Subject

{

       private RealSubject realSubject; //代理角色內部引用了真實角色

      

       public void request()

       {

              this.preRequest(); //在真實角色操作之前所附加的操作

             

              if(null == realSubject)

              {

                     realSubject = new RealSubject();

              }

             

              realSubject.request(); //真實角色所完成的事情

             

              this.postRequest(); //在真實角色操作之後所附加的操作

       }

      

       private void preRequest()

       {

              System.out.println("pre request");

       }

      

       private void postRequest()

       {

              System.out.println("post request");

       }

}

 

 

//客戶端使用

public class Client

{

       public static void main(String[] args)

       {

              Subject subject = new ProxySubject();

             

              subject.request();

       }

}

 

輸出結果:

pre request

From real subject

post request

 

 

 

//動態代理模式

//這裏必須是接口,因爲在代理對象中實例化參數是接口數組

public interface Subject

{

       public void request();

}

//真實對象,購房者

public class RealSubject implements Subject

{

       public void request()

       {

              System.out.println("From real subject!");

       }

 

}

 

 

/**

 * 該代理類的內部屬性是Object類型,實際使用的時候通過該類的構造方法傳遞進來一個對象

 * 此外,該類還實現了invoke方法,該方法中的method.invoke其實就是調用被代理對象的將要

 * 執行的方法,方法參數是sub,表示該方法從屬於sub,通過動態代理類,我們可以在執行真實對象的方法前後

 * 加入自己的一些額外方法。

 *

 */

//動態代理

public class DynamicSubject implements InvocationHandler

{

       private Object sub;

      

       public DynamicSubject(Object obj)

       {

              this.sub = obj;

       }

      

       public Object invoke(Object proxy, Method method, Object[] args)

                     throws Throwable

       {

              System.out.println("before calling: " + method);

             

              method.invoke(sub, args);//其實這個method就是class對象下的request()方法,調用了真實對象下的request()方法,參數new Object[]{}是null空的。

             

              System.out.println(args == null);

             

              System.out.println("after calling: " + method);

             

              return null;

       }

      

      

}

 

//客戶端

public class Client

{

       public static void main(String[] args)

       {

              RealSubject realSubject = new RealSubject();

 

              InvocationHandler handler = new DynamicSubject(realSubject);

 

              Class<?> classType = handler.getClass();

 

              // 下面的代碼一次性生成代理

 

              Subject subject = (Subject) Proxy.newProxyInstance(realSubject

                            .getClassLoader(), realSubject.getClass().getInterfaces(),

                            handler);//實例化一個代理出來,每一個代理實例都會有一個相應的handler處理裏面的invoke方法

 

              subject.request();//這個subject的實例是$Proxy0代理

 

              System.out.println(subject.getClass());

 

       }

      

      

       另外一種動態代理的表示形式:

public class VectorProxy implements InvocationHandler

{

       private Object proxyObj;

 

       public VectorProxy(Object obj)

       {

              this.proxyObj = obj;

       }

 

       public static Object factory(Object obj)

       {

              Class<?> classType = obj.getClass();

 

              return Proxy.newProxyInstance(classType.getClassLoader(),

                            classType.getInterfaces(), new VectorProxy(obj));

       }

      

       public Object invoke(Object proxy, Method method, Object[] args)

                     throws Throwable

       {

              System.out.println("before calling: " + method);

             

              if(null != args)

              {

                     for(Object obj : args)

                     {

                            System.out.println(obj);

                     }

              }

             

              Object object = method.invoke(proxyObj, args);

             

              System.out.println("after calling: " + method);

             

              return object;

       }

      

       public static void main(String[] args)

       {

              List v = (List)factory(new Vector());

             

              System.out.println(v.getClass().getName());

             

              v.add("New");

              v.add("York");

             

              System.out.println(v);

             

              v.remove(0);

              System.out.println(v);

             

       }

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章