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

上二篇主要讲了面向对象抽象类的使用。通过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 那个标准

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

声明如下:

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

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

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

时间: 2024-10-09 17:52:06

面向对象抽象类的实际项目的应用的相关文章

c# 面向对象抽象类的使用

上一篇 讲了 Java 面向对象抽象类的使用.这次我们来学习 C#面向对象抽象类的使用.其实方法理论掌握了,语言只是工具.闲话少说.下面是上一篇的需求 抽象类大家都知道,但是具体有什么用,为什么要用到抽象类.大家肯定有人不太明白.培训中心老师怎么教就怎么用.最近闲来无事.研究起面向对象理论.下面让我用一个例子来说明一下.面向对象抽象类的使用方法.只是起到一个入门和抛砖引玉的作用.(理论和语言无关) 定义和概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来

Java面向对象-抽象类

Java面向对象-抽象类 定义:在java中,含有抽象方法的类称为抽象类,同样不能生成对象: 注意点: 1,包含一个抽象方法的类是抽象类: 2,抽象类和抽象方法都要用abstract关键字修饰: 3,抽象方法只需要声明而不需要实现: 4,抽象类必须被子类继承,(假如不是抽象类)必须重写抽象父类中的全部抽象方法: 5,抽象类不能被实例化: 我们先来定义一个抽象类: 1 package com.java1234.chap03.sec11; 2 3 /** 4 * 定义一个抽象类People 5 *

面向对象——抽象类和抽象方法

*概念 类中定义一些不含方法体的方法,它的方法体实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就是抽象类.抽象类能够被用于类,方法,属性,索引器和事件,使用abstract 在一个类声明中表示该类倾向要作为其它类的基类成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现. 抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个集成关系形成的等级结构里面,树叶节点应该是具体类,而树枝节点应该是抽

Php面向对象 -- 抽象类

抽象类abstract: 有一种类,只能被继承,不能实例化对象.原因就是这个类的定义不完整. 因为php支持定义一种,只有方法的声明部分,而没有方法的实现部分的不完整方法. 如果某个类,包含了这种不完整的方法,就不是不完整类,也就不能实例化对象. 不完整的类,称之抽象类 所包含的不完整的方法,称之抽象方法. 定义: 包含抽象方法的类,就是抽象类. 语法: 定义抽象方法,利用abstract的关键字,告知php那个方法为抽象方法 如果一个类包含一个抽象方法,也就是抽象类,因此也需要使用abstra

面向对象 抽象类、接口、类库、五大原则

抽象类 抽象类,只为继承而出现,不定义具体的内容,只规定该有哪些东西一般抽象类中只放置抽象方法,只规定了返回类型和参数比如: 人    - 有吃饭,睡觉方法 男人 - 继承人抽象类,必须实现吃饭,睡觉的方法主体 女人 - 继承人抽象类,必须实现吃饭,睡觉方法的主体 抽象类中可以有普通属性,通过子类来使用 1.关键字:abstract2.抽象类可以包含抽象方法和普通方法3.abstract关键字可以定义方法为抽象方法,抽象方法可以没有函数体4.抽象类无法被实例化,抽象类主要做为一个基类,让别的类继

SQL面向对象抽象类

抽象类:抽象类,只为继承而出现,不定义具体的内容,只规定该有哪些东西:一般抽象类中只放置抽象方法,只规定了返回类型和参数:例: 人 - 有吃饭,睡觉方法: 男人 - 继承人抽象类,必须实现吃饭,睡觉的方法主体: 女人 - 继承人抽象类,必须四线吃饭,睡觉方法的主体: 抽象类中可以有普通属性,通过子类来使用: 1.关键字:abstract2.抽象类可以包含抽象方法和普通方法3.abstract关键字可以定义方法为抽象方法,抽象方法可以没有函数体4.抽象类无法被实例化,抽象类主要做为一个基类,让别的

面向对象-抽象类

老王是个高富帅.老王是具体类型,高富帅是抽象类,接口是高.富.帅. 抽象类继承有个 is-a关系,语义上“老王是个高富帅”就是继承.接口描述的是行为, 抽象类是一个具体类的抽象,而接口又是抽象类的抽象.就像LeiMing说的那样,接口和抽象类的存在更多是因为设计上的需要,为以后的扩展.在设计模式中有一个“开闭”原则,这就要求我们面向“抽象”编程,而不面向“实现”编程,因为你在设计一个类的时候永远不知道以后会有什么新的类加入进来,所以我们一个方法接受的参数尽量使用接口.    个人觉得应该多使用抽

面向对象-抽象类和接口解析

1. 什么是抽象类 在面向对象编程中,我们通过类来描述事物,这个描述可以是抽象的,因为不可能通过类描述所有的属性和行为,可能同一类事物的不同个体有着行为上的差异.例如我们想用一个类描述鸟的所有基本属性和行为,而所有的鸟都继承自这个类,我们可以把它称为基类.而鸟的叫声是有差异的,我们很难在基类中定义鸟的这个行为,这时候我们就需要用到抽象方法了,将鸟叫这个行为用抽象方法描述,让子类对象自己去实现,而包含抽象方法的类也必须声明为抽象的,这就是抽象类. 总的来说就是:抽象类可以使用抽象的方式描述事物的行

python面向对象:抽象类

接口与归一化设计 1.什么是接口 hi boy,给我开个查询接口...此时的接口指的是:自己提供给使用者来调用自己功能的方式\方法\入口,Java中的interface使用如下: =================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface接口的特征: * 1)是一组功能的集合,而不是一个功能 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作 * 3)接口只定义函数,但不涉及函