1. 程式人生 > >關於java中的“增強”類的幾種方法

關於java中的“增強”類的幾種方法

為了便於對現有專案的擴充套件,我們會通過java的特性,對現有的類進行“強化”,在此介紹幾種方法

  1. 繼承,java是面向物件的語言,繼承機制使他的可擴充套件性大大增強,我們可以通過繼承方式對現有類進行擴充套件增強。子類繼承父類之後可以獲得父類所有的公共方法,子類可以進行重寫等操作,這種方式簡便易學,但是隨之而來的是程式碼的耦合性大大的增強,不利於後期的維護,所以對於繼承這種方法,謹慎使用。
  2. 實現介面類,隨著繼承機制而來的是實現介面技術,子類實現介面類,對介面進行重寫操作,通過多型的形式進行呼叫,這種方法大大減少了程式碼耦合性,可以說是改良版的繼承模式,在目前的程式設計中,我們一般是儘可能的使用介面,而儘可能少的使用繼承
  3. 裝飾者設計模式,設計模式是java程式設計的重要組成部分,確切的說不僅僅是Java,幾乎所有的高階程式語言都多多少少會涉及到程式設計模式。當然想要完全理解設計模式,單純學習一門語言是完全不夠的,java只是設計模式的其中一個代表。百度百科中的解釋為:在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。這種說法很抽象,我們可以舉一個比較簡單的例子,即java的IO流就是標準的裝飾者模式,位元組流往往會作為被裝飾的類即,作為裝飾類的輸入字元流等類中,裝飾的類需要實現被裝飾類的介面,在這裡我們拿出java中的兩個類做解釋InputStream和BufferedInputStream,兩個類分別為位元組輸入流和位元組緩衝輸入流,簡單來說緩衝流就是位元組流的強化版,使用的模式就是裝飾者模式,我們可以看到BufferedInputStream的構造方法中BufferedInputStream(InputStream in) 位元組流就是作為引數輸入,這樣緩衝流中的可以通過輸入的位元組流物件來呼叫位元組流中的所有的方法,同時不會妨礙緩衝流的私有方法,這就是比較經典的裝飾者強化
  4. 代理模式,代理類模式理解起來會比裝飾者設計模式更加難,因為這個涉及到反射的原理,此處可以看一段程式碼
    HttpServletRequest MyRequest = (HttpServletRequest)Proxy.newProxyInstance(
    Codefilter.class.getClassLoader(),
    request.getClass().getInterfaces(),
    new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    String method1 = method.getName();
    if("getParameter".equals(method1)){
    String requestMethod = request.getMethod();
    if("get".equalsIgnoreCase(requestMethod)){
    String str = request.getParameter(args[0].toString());
    return new String(str.getBytes("iso-8859-1"),"utf-8");
    }
    }
    return method.invoke(request, args);
    }
    });

    通過Codefilter類的類物件獲得類載入器,當然此時的類載入器為appclassloader,主要是負責載入應用類,再通過newProxyInstance方法的第二個引數,獲得類的介面,然後第三個引數傳入一個InvocationHandler介面的匿名實現類,此時就可以重寫invoke方法來對類進行加強,以上的程式碼的例子就行增強的request物件中的getParameter方法,使之可以處理漢字在tomcat中的亂碼問題。相對於裝飾者設計模式,代理模式不用考慮因為實現被裝飾的類的介面而重寫的大量的方法,代理模式程式碼量比較少,完成功能比較多,這也是spring框架中的aop面向切面程式設計的底層實現方法。