簡介
上二篇主要講了面向對象理論中抽象類的具體應用。但是舉的例子很簡單。所以這一篇想模擬一個實際的項目來具體說明一下抽象類的具體應用。采用的語言是Java必定會這種語言的童鞋很多。
項目需求:
模擬開發一個播放視頻的萬能播放器的功能。可以播放AVI、MPEG、RMVB 對這三種格式的視頻播放。
例如:001.avi 自動選擇播放AVI格式的功能 001.mpeg 自動選擇播放MPEG格式的功能 001.rmvb 自動選擇播放RMVB格式的功能
其它格式,提示用戶。此文件格式不能進行播放。具體播放功能可以不用實現。可以用信息來代替。
需求分析:
通過上面的內容我們知道面向對象的主體是播放器(面向對象開發主要就是在需求中找到相應的對象)方法體是播放視頻功能,實現的功能是(播放xxxxxx格式視頻)具體功能不用實現。只是模擬一下播放的過程。
通過上面分析 抽象類 :播放器 抽象方法 :播放功能
子類 Avi、Mpeg、RMVB
思路清晰了,下面開始編寫代碼。
下面是代碼實現,已經測試過:
定義抽象類PlayerHelper:
1 package com.PlayerHelper; 2 3 public abstract class PlayerHelper { 4 public String FileName = ""; 5 6 public PlayerHelper(String FileName) { 7 this.FileName = FileName; 8 } 9 10 public abstract void Play() throws Exception; 11 }
題外話:
這樣寫異常還有一個好處就是。想調用此方法時強制你寫異常處理。防止你發生漏寫的情況。
定義子類Avi:
1 package com.PlayerHelper; 2 3 public class Avi extends PlayerHelper { 4 5 public Avi(String FileName) { 6 super(FileName); 7 // TODO Auto-generated constructor stub 8 } 9 10 @Override 11 public void Play() throws Exception { 12 try { 13 System.out.print("播放AVI格式視頻"); 14 } catch (Exception ex) { 15 throw new Exception(ex); 16 } 17 } 18 }
定義子類Mpeg:
1 package com.PlayerHelper; 2 3 public class Mpeg extends PlayerHelper { 4 5 public Mpeg(String FileName) { 6 super(FileName); 7 } 8 9 @Override 10 public void Play() throws Exception { 11 System.out.print("播放Mpeg格式視頻"); 12 } 13 }
定義子類Rmvb:
1 package com.PlayerHelper; 2 3 public class Rmvb extends PlayerHelper { 4 5 public Rmvb(String FileName) { 6 super(FileName); 7 } 8 9 @Override 10 public void Play() throws Exception { 11 System.out.print("播放RMVB格式視頻"); 12 } 13 }
測試類 Test
1 package com.PlayerHelper; 2 3 public class Test { 4 public static void main(String[] args) { 5 PlayerHelper playhelper = new Avi("001.avi"); 6 try { 7 playhelper.Play(); 8 } catch (Exception ex) { 9 System.out.print(ex.toString()); 10 } 11 } 12 }
上面的代碼這么寫沒有問題,但是你會發現越寫main中的代碼越多。而且達不到萬能播放的效果。如果現在播放 001.mpeg 怎么辦
PlayerHelper playhelper=new Avi("001.mpeg");
你肯定會說我加一個方法。獲取文件擴展名的功能。然后根據擴展名在去調用各個子類。這樣的結果是代碼越來越多。以后維護起來越來越亂。那怎么辦。很簡單我們在建立一個管理類,讓其去做自動識別播放的功能
管理類新鮮出爐
1 package com.PlayerHelper; 2 3 public class PlayerManagement { 4 public PlayerHelper playerhelper; 5 6 public boolean Player(String FileName) throws Exception { 7 String FileExtension = ""; 8 FileExtension = FileName.substring(FileName.lastIndexOf(".") + 1); 9 10 if (FileExtension != "" || null != FileExtension) { 11 switch (FileExtension.toUpperCase()) { 12 case "AVI": 13 playerhelper = new Avi(FileName); 14 break; 15 case "MPEG": 16 playerhelper = new Mpeg(FileName); 17 break; 18 case "RMVB": 19 playerhelper = new Rmvb(FileName); 20 break; 21 default: 22 return false; 23 } 24 try { 25 playerhelper.Play(); 26 } catch (Exception ex) { 27 throw new Exception(ex); 28 } 29 return true; 30 } else { 31 return false; 32 } 33 } 34 }
測試類代碼更改為
1 package com.PlayerHelper; 2 3 public class Test { 4 public static void main(String[] args) { 5 boolean bolTemp = false; 6 PlayerManagement pm = new PlayerManagement(); 7 try { 8 bolTemp = pm.Player("001.avi"); 9 if (bolTemp == false) { 10 System.out.print("此文件格式不能進行播放"); 11 } 12 } catch (Exception ex) { 13 System.out.print(ex.toString()); 14 } 15 } 16 }
代碼功能解析
public boolean Player(String FileName) throws Exception
方法的返回值為什么要采用布爾型。是因為 播放成功與否就二個狀態
- 播放成功,不用提示用戶。播放相應的視頻就可以。播放成功,不用提示用戶。播放相應的視頻就可以。
- 播放失敗 需要提示用戶。
舉例說明
你讓你朋友幫你搶小米手機,搶到以后再給他錢。結果出現下面二種情況你會選擇那種情況。
- 當沒有搶到的時候,你同事給你掛電話。告訴你手機沒有搶到。
- 沒有搶到的時候,你同事不給你任何消息。等一個月以后,你打電話的時候,告訴你沒有搶到。
我想大家肯定會選擇第一種。我們做程序一定要站在用戶的角度考慮問題。所以要加一個播放成功與否的狀態。
FileName.substring(FileName.lastIndexOf(".") + 1);
獲取文件名擴展名的方法。這個隨便。我只是隨便寫了一個,你可能有更好的實現辦法。總之實現了就可以。
正常這塊也應該加一個單獨的異常。獲取文件名擴展名是最容易出錯的地方。因為不可能每一個文件名稱都像 001.avi 那個標准
是不是感覺抽象類很有用,假如以后追加 其它格式 只需增加相應的子類功能。
聲明如下
- 學會用抽象的面向對象思想解決問題,是作為程序員一個良好的習慣。
- 技術無止境,學習無止境。我只是起到一個入門和拋磚引玉的作用。
- 因為本人有很多的工作要做。寫這個主要是利用業余時間。難免代碼有錯誤的地方。或文字上有錯別字。還是這句話,寫這些主要是教大家如何學習。理論掌握了,語言只是工具。謝謝大家在百忙之中觀看此文。
- 文中代碼實現,已經測試過:
- 我寫的內容可以隨便轉載,歡迎大家轉載。
