码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象抽象类的实际项目的应用

时间:2015-02-27 16:31:07      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

上二篇主要讲了面向对象抽象类的使用。通过Java 和c# 二个语言来说明其如何应用。举的例子也很简单。这一篇想模拟一个实际的项目来具体说明一下。采用的语言是Java必定会这种语言的童鞋很多。

实际项目:

开发一个视频的万能播放器。可以播放AVI、MPEG、RMVB 对这三种格式的视频播放。

     例如:001.avi  自动选择播放AVI格式的功能 001.mpeg 自动选择播放MPEG格式的功能 001.rmvb 自动选择播放RMVB格式的功能

其它格式,提示用户。此文件格式不能进行播放。具体播放功能可以不用实现。可以用信息来代替。

通过上面的内容我们知道面向对象的主体是播放器(面向对象开发主要就是在需求中找到对象)方法是播放视频功能 方法实现的功能是(播放xxxxxx格式视频)具体功能不用实现。只是模拟一下播放的过程。

通过上面分析 抽象类  播放器  抽象方法 播放功能

子类  Avi、Mpeg、RMVB

测试类 Test

思路清晰了,开始编写代码。

定义抽象类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

我定义的方法的返回值为布尔型。因为 播放成功与否就二个状态 1 播放成功,不用提示用户。播放相应的视频就可以。 2 播放失败 需要提示用户。

举个例子。你让你朋友帮你抢小米手机,抢到以后给他钱。结果发生下面二种情况你会认为那种为最好。

1、没有抢到的时候,你同事给你挂电话。告诉你手机没有抢到。

2、没有抢到的时候,你同事不给你任何消息。等一个月以后,你打电话的时候,告诉你没有抢到。

你肯定会选择第一种。这就叫用户体验。

我们做程序一定要站在用户的角度考虑问题。所以要加一个播放成功与否的状态。

FileName.substring(FileName.lastIndexOf(".") + 1); 

获取文件名扩展名的方法。这个随便。我只是随便写了一个,你可能有更好的实现办法。总之实现了就可以。

正常这块也应该加一个单独的异常。获取文件名扩展名是最容易出错的地方。因为不可能每一个文件名称都像 001.avi 那个标准

是不是感觉抽象类很有用,假如以后追加 其它格式 只需增加相应的子类功能。

声明如下:

学会用抽象的面向对象思想解决问题,是作为程序员一个良好的习惯

技术无止境,学习无止境。我只是起到一个入门和抛砖引玉的作用。

因为本人有很多的工作要做。写这个主要是利用业余时间。难免代码有错误的地方。或文字上有错别字。还是这句话,写这些主要是教大家如何学习。理论掌握了,语言只是工具。谢谢大家在百忙之中观看此文。

 

面向对象抽象类的实际项目的应用

标签:

原文地址:http://www.cnblogs.com/littlestone/p/4303351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!