設計模式之代理模式

        要想了解代理模式首先要知道什麼是代理模式?代理模式的使用場景是什麼,有什麼優缺點。顧名思義,代理模式關鍵就是一個代理,爲什麼要代理,是因爲原來的業務類已經不能滿足需求的變化,如果直接在原來的業務類上修改,改動工作量大,而且容易引發新的問題,因此我們需要一個代理類,在代理類實現業務的擴展需要,實際上代理類並不真正實現服務,而是通過調用委託類的相關方法提供特定的服務。代理又包含靜態代理和動態代理,靜態代理是在程序運行前代理類的class字節碼文件已經生成了,而動態代理則是在程序運行的過程中通過反射創建的。

一、靜態代理

  1. 創建服務接口 

    public interface Work {
    //定義一個名字爲work的方法
      void work();
    }

     

  2. 業務類實現接口,並實現接口

    public class WorkImpl implements Work{
      @Override
      public void work() {
        System.out.println("開始工作");
    
      }
    }

    3.這個類實現了工作方法,但是我們要在工作前加入吃飯,工作後加入健身的邏輯,創建代理類。

    public class WorkProxy implements Work{
      private Work work;
      public WorkProxy(final Work work) {
        this.work = work;
      }
      @Override
      public void work() {
        System.out.println("吃飯");
        work.work();
        System.out.println("進行健身");
      }
    
    }

    4.進行測試。

    public class TestProxy {
      public static void main(String[] args) {
        Work work = new WorkImpl();
        work.work();
        System.out.println("----------");
        WorkProxy workProxy = new WorkProxy(work);
        workProxy.work();
    
      }
    
    }

    測試結果:

    開始工作

    ----------

    吃飯

    開始工作

    進行健身

    優點:我們在不改變原有對象的基礎上,對原來的對象進行了擴展。

    缺點:如果我們需要擴展的對象比較多,爲每個對象創建代理類工作量也很大。

    二、動態代理

          使用動態代理的話,我們不需要手動創建代理類,真正的代理對象有JDK在我們使用的時候創建,我們需要編寫動態處理器。

    1.動態處理器編寫。

    package com.chongzi.keji.other;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    public class DynamicProxy implements InvocationHandler{
      private Object object;
      public DynamicProxy(final Object object) {
        this.object = object;
      }
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("吃飯");
        Object result = method.invoke(object, args);
        System.out.println("開始健身");
        return result;
      }
    }

    2.測試類的編寫。

    package com.chongzi.keji.other;
    import java.lang.reflect.Proxy;
    public class DynamicTest {
      public static void main(String[] args) {
        Work work = new WorkImpl();
        Work proxyWork = (Work)Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),
            new Class[]{Work.class},new DynamicProxy(work));
        proxyWork.work();
      }
    }

    測試結果:

    吃飯

    開始工作

    開始健身

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