下面我將以兩個例子來充分闡述Java中多態的可拓展性,作為一名優秀的程序員,就必須了解程序的可拓展性,非常利於程序後續的開發。
第一個例子:利用電腦的主板來作為例子,就我們所熟悉的電腦的主板,裡面是不是有很多模塊,網卡,聲卡,想要用到這些功能,只能當主板運行起來,再給網卡和聲卡供電就可以,但這用軟件語言怎麼來實現呢?是不是先要主板跑起來,主板再讓聲卡或者網卡跑起來,但這樣做,拓展性不高讓聲卡和網卡跑起來的操作是重復的,而且有很多模塊也具備這樣的功能,就單純讓主板上的模塊跑起來,這是其一,萬一,那一天,技術更新,新的模塊出現了,是不是又要創建模塊的對象,然後又跑起來,這顯然是不利於開發的,但是針對這一個問題,主板的廠商和聲卡,網卡的廠商商量後,以後就用一個PCI接口來連接主板和模塊,徹底解決了更新不能用或者重復使用的問題,而這恰恰對應了我們的java中的多態,利用多態,我們能大大提高程序的可拓展性!具體代碼如下!
/*
需求:
電腦運行實例,
電腦運行基於主板。
*/
interface PCI
{
public void open();
public void close();
}
class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}
public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子類對象。
{
if(p!=null)
{
p.open();
p.close();
}
}
}
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}
/*
class MainBoard
{
public void run()
{
System.out.println("mainboard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}
class NetCard
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
}
}
*/
class DuoTaiDemo5
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二個例子:利用常用數據庫來解釋多態,就我們熟知的數據庫而言,目前有兩種數據庫的連接模式:JDBC和Hibernatelian連接,使用數據庫,都有兩個必不可少的操作,連接和關閉,這時候,使用接口,把這兩種操作封裝起來,需要使用那種連接模式直接更換類名就可以了!具體代碼如下!
/*
需求:數據庫的操作。
數據是:用戶信息。
1,連接數據庫。JDBC Hibernate
2,操作數據庫。
c create r read u update d delete
3,關閉數據庫連接。
*/
interface UserInfoDao
{
public void add(User user);
public void delete(User user);
}
class UserInfoByJDBC implements UserInofDao
{
public void add(User user)
{
1,JDBC連接數據庫。;
2,使用sql添加語句添加數據。;
3,關閉連接。
}
public void delete(User user)
{
1,JDBC連接數據庫。;
2,使用sql添加語句刪除數據。;
3,關閉連接。
}
}
class UserInfoByHibernate implements UserInfoDao
{
public void add(User user)
{
1,Hibernate連接數據庫。;
2,使用sql添加語句添加數據。;
3,關閉連接。
}
public void delete(User user)
{
1,Hibernate連接數據庫。;
2,使用sql添加語句刪除數據。;
3,關閉連接。
}
}
class DBOperate
{
public static void main(String[] args)
{
//UserInfoByJDBC ui = new UserInfoByJDBC();
// UserInfoByHibernate ui = new UserInfoByHibernate();
UserInfoDao ui = new UserInfoByHibernate();
ui.add(user);
ui.delete(user);
}
}
總結:
1.這兩個例子都使用了接口來抽象出一些重復的操作,為了讓不同的模塊能直接快捷地使用這些操作,直接使用多態的向上轉型(看我之前的博客),能後用父類引用去調用,反正之後無論是技術更新而有了新的模塊或者更換已有模塊,我們都可以使用父類的引用去直接調用它們共同的操作!
2.不一定用接口,也可以使用抽象類,但是,使用接口,可拓展性更高,以後有更新,可以直接改動接口,不用去改動抽象類,其次,使用接口,能夠被多繼承!這也是方便的地方。