多態的優勢與特點,爲什麼用多態

什麼是多態?爲什麼用多態?有什麼好處?

多態可以分爲變量的多態,方法的多態,類的多態.我這裏強調的是類的多態,這是我們在以後的工作中經常回用到的

首先,有這樣一個系統:有個學生工作從達內畢業了,作的還不錯.買了輛捷達汽車.這個系統應該如何設計呢?
按照OO的思想,我們會抽象出來一個類,表示捷達汽車,其中有個run()方法
public class JD{
public void run(){
       System.out.println("JD在以120邁的速度在run");
}
}
我們還會抽象出一個類,來代表人.其中有個drive()方法,需要一個汽車類型作爲參數,我們先傳入一個JD類型的參數

// 這是我們的核心業務類
public class Person{
public void drive(JD jd){
       jd.run();
}

public static void main(String args[]){
   Person p =new Person();
   JD jd = new JD();
   p.drive(jd);
}
}

如果你寫出這樣的代碼的話,恭喜你!你中大獎了!---------------------你會被項目精力砍死的!!!!!!!

項目經理爲什麼會砍你呢?
因爲你寫的代碼偶合性太強了!

如果我們的需求變了,這個學生後來更有錢了,買了一兩Benz.那麼我們以前的系統怎麼辦啊.不要指望你作的系統永遠不會變化
我們的系統只能修改!這就是項目經理砍你的原因
我們的系統會增加一個Benz類,也有個run()方法

public class Benz{
public void run(){
       System.out.println("Benz在以200邁的速度在run");
}
}

我們的核心業務類也要修改

public class Person{

    /*
public void drive(JD jd){
       jd.run();
}
*/

public void drive(Benz b){
       b.run();
}

public static void main(String args[]){
   Person p =new Person();
   Benz b = new Benz();
   p.drive(b);
}
}

以後的情況,我們可以把車抽象出來:
public abstract class Driver{
   /*屬性*/
   public void run();//讓子類來運行
}

public Benz extends Driver{
   public void run(){
System.out.println("Benz在以200邁的速度在run");
   }
}
public JD extends Driver{
   public void run(){
System.out.println("JD is running...");
   }
}

public class Person{
private Driver driver;
public Person(){

}
public Person(Driver driver){
   this.driver = driver;
}
public void drive(){
       driver.run();
}
public void setDriver(Driver driver){//運用參數多態,以後不管買什麼車都可以
   this.driver = driver;
}


public static void main(String args[]){
   Person p =new Person();
   JD jd = new JD();//剛開始沒錢就買輛JD吧
   p.setDriver(jd);
   p.driver();
   Benz benz = new Benz{();//有錢換車了
   p.setDriver(benz);
   p.driver();
}
}

什麼是多態? 
簡單的說:就是用基類的引用指向之類的對象

提問:多態可以用在什麼地方呢?
回答:可以用在方法的參數中和方法的返回類型中

其中方法的參數樓上的兄弟已經給出了代碼.我這裏給出在方法的返回類型中如何使用多態

上面的例子中,不管是JD還是Benz都是我們自己直接new出來的.我們可以設計一個工廠類,專門生成汽車

/**
*   我們將多態使用在方法的返回類型中
*   Car可以是抽象類,也可以是接口,JD和Benz分別繼承該類或實現該藉口
*/
public class CarFactory{
public Car factory(String carName){
   if(carName.equals("JD")){
      return new JD();
   }else if(carName.equals("Benz")){
      return new Benz();
   }else{
      System.out.println("對比起,不伺候");
      return null;
   }
}
}

這實際上就是設計模式中的簡單工廠模式!

另外,我我們在JDK中可以大量的看到多態的應用,比如在Object類中的equals(Object obj)方法中,參數是個Object

類型的參數.因爲Object是Java中所有類的基類.,但是才傳入參數的時候,可以傳入任何一個類的對象
這就是多態的應用!

使用多態可以解決項目中緊偶合的問題,提高程序的課擴展性.是OCP原則的一個具體的實現

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