1. 程式人生 > 程式設計 >java根據不同的引數呼叫不同的實現類操作

java根據不同的引數呼叫不同的實現類操作

本猿今天今天幫公司寫第三支付介面的時候,靈機一動就想寫一個擴充套件性比較的強的充值介面,t通過選擇不同的充值渠道,呼叫不同的充值實現類(好了,廢話不多說了,上碼!!!!!)

首先你得寫一個介面(樓主用的框架是springMVC +Spring +嘿嘿)PayService

java根據不同的引數呼叫不同的實現類操作

然後寫你的PayService實現類 EcpssPayService(第三方介面實現類)和 ReapalPayService(第三方介面實現類) 注意幾點(註解一定得跟上)

java根據不同的引數呼叫不同的實現類操作

好了之後 就可以 寫一個工具類了 SpringBeanUtil(這其中至於違背了Spring的 依賴注入思想 慎用什麼的 我只想說你愛用不用 嘿嘿)

java根據不同的引數呼叫不同的實現類操作

寫好了之後(ok完工了), 接下來你就可以在Controller中呼叫了(你通過前端傳過來的引數payWay來呼叫不同的實現類:比如說我傳過來的是reapal

那麼就掉用ReapalService類,傳過來的是ecpss那麼就呼叫EcpssPayService!).

java根據不同的引數呼叫不同的實現類操作

最後再說下你的實現類一定是在Spring 載入掃描包的時候能掃描到,否則你就Duang瞭如果爆了類未定義少年那隻能說明你還年輕 嘿嘿 去看看applicationContext.xml如下

java根據不同的引數呼叫不同的實現類操作

看看component-scan 有沒有掃描到你的兩個實現類的包的路徑 over!!!!

補充知識:在java類中實現不同介面的同名方法時,該方法屬於哪個介面?

存在這樣一種情況,有一個類實現了兩個介面,在這兩個介面當中有相同的方法(同名同參),那麼類中的該實現方法屬於哪個介面的呢?

public interface InterfaceA {
  void method();
  void methodA();
}

public interface InterfaceB {
  void method();
  void methodB();
}

public class Subject implements InterfaceA,InterfaceB {

  @Override
  public void method() {

  }

  @Override
  public void methodB() {

  }

  @Override
  public void methodA() {

  }
}

Subject類實現了InterfaceA和InterfaceB兩個介面的方法,其中method是InterfaceA和InterfaceB共用的相同方法,那麼Subject類中實現的該方法是屬於哪個介面的呢?

答案是既是InterfaceA的也是InterfaceB的,什麼意思?就是說此時的Subject類你既可以把它當做InterfaceA來使用其中的method方法,也可以把它當做InterfaceB來使用其中的method方法。

Java對於implements的要求是隻要在介面中宣告的方法,在實現類中必須要實現它,單看Subject 類,它裡面具有method和methodA兩個方法,因此它就是實現了InterfaceA介面所有方法的實現類,同時它裡面具有method和methodB兩個方法,因此它也是實現了InterfaceB介面所有方法的實現類。

因此,在使用Subject 類的時候,如果你認為它是InterfaceA,那它就是InterfaceA,如果你為它是InterfaceB,那它就是InterfaceB。

所以可以像下面這樣去使用它,完全沒有問題:

public class Main {

  public static void main(String[] args) {
    //我現在認為它是一個InterfaceA實現類,就把它當做一個InterfaceA介面來使用
    InterfaceA interfaceA = new Subject();
    interfaceA.method();
    interfaceA.methodA();

    test(interfaceA);

    //我現在認為它是一個InterfaceB實現類,就把它當做一個InterfaceB介面來使用
    InterfaceB interfaceB = new Subject();
    interfaceB.method();
    interfaceB.methodB();

    //下面都是完全沒問題的
    Subject subject = new Subject();
    subject.myMethod();
    //當成InterfaceA用
    interfaceA = subject;
    interfaceA.method();
    interfaceA.methodA();
    //當成InterfaceA用的過程中又可以當成InterfaceB用
    interfaceB = subject;
    interfaceB.method();
    interfaceB.methodB();
    //當成InterfaceB用的過程中又可以再當成InterfaceA用
    interfaceA = (InterfaceA) interfaceB;
    interfaceA.method();
    interfaceA.methodA();
    //...隨便用...
  }

  private static void test(InterfaceA interfaceA){
    //如果我知道InterfaceA的實現類同時也implements了InterfaceB
    // 那麼我就可以把它當做InterfaceB的實現類來使用
    InterfaceB interfaceB = (InterfaceB) interfaceA;
    interfaceB.method();
    interfaceB.methodB();
  }
}

以上這篇java根據不同的引數呼叫不同的實現類操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。