多态
定义
同一操作作用于不同的实例,产生不同运行结果的机制。
场景
小王准备开发一个万能加载器,为爷爷提供便捷的操作,快速的打开电脑中指定的文件。
万能加载器需求点:
1、自动加载各种资料,一站式搜索系统常见资料。
2、能够打开常见文档类资料,例如。PDF,TXT,doc,xls等,
3、能够打开图片资料,例如,png、jpg、gif等等,
4、能够打开音频、视频资料,例如,avi、mp3等。
5、支持简单可用的类型扩展接口,易于实现更多的文件类型加载。
//可支持文件类型,以文件扩展名划分
enum FileType
{
doc,//doc文档
pdf,//pdf文档
txt,//txt文档
ppt,//Powerpoint文档
jpg,//jpg格式图片
gif,//gif格式图片
mp3,//mp3音频文件
avi//avi视频文件
}
/// <summary>
/// 文件类,表示不同类型的文件资料
/// </summary>
class Files
{
private FileType fileType;
public FileType FileTypes
{
get { return fileType; }
}
}
//打开文件管理器,每一种文件有一种打开方式。
class FileMananger
{
//打开doc文档
public void OpenDocFile()
{
Console.WriteLine("Alibaba, Open the Word file.");
}
//打开pdf文档
public void OpenPDFFile()
{
Console.WriteLine("Alibaba, Open the PDF file.");
}
//打开txt文档
public void OpenTXTFile()
{
Console.WriteLine("Alibaba, Open the TXT file.");
}
//打开PNG格式图片
public void OpenPNGFile()
{
Console.WriteLine("Alibaba, Open the PNG File.");
}
//打开MP3音频格式
public void OpenMP3File()
{
Console.WriteLine("Alibaba, Open the MP3 file.");
}
//...需要将所有需要打开的格式,都添加一个方法。OpenJpgFile、OpenGifFile、OpenMp3File、OpenAviFil
//e...
}
//调用端
class FileClient
{
public static void Main()
{
//启动文件管理器
FileMananger fileMananger = new FileMananger();
//看到一堆一堆电脑文件
IList<Files> files = new List<Files>();
//加载文件
foreach (Files item in files)
{
switch (item.FileTypes)
{
case FileType.doc:
fileMananger.OpenDocFile();
break;
case FileType.pdf:
fileMananger.OpenPDFFile();
break;
case FileType.txt:
fileMananger.OpenTXTFile();
break;
case FileType.jpg:
fileMananger.OpenPNGFile();
break;
case FileType.mp3:
fileMananger.OpenMP3File();
break;
//..... 部分省略
}
}
}
}
按照以上思路,当用户需要添加其他格式的文件(eg:rm视频格式)进行播放时,需要我们再添加文件的支持类型、文件的打开方式、调用端修改。这简直是一场噩梦。
分析以上设计存在的问题点有:
1、新增需求,客户端需要被修改
2、word、pdf、mp3等,都是可实现的独立对象,整个系统除了文件管理器,几乎没有面向对象的影子,都是面向结构和过程的开发方式。
3、在文件打开的程序中,可以归类方法,来复用、构造。
4、由于系统没有分割和规划,几乎不能实现任何简单的扩展和维护。
需求变更是结构设计的大敌,实现灵活扩展和简单变更的设计构思,是面向对象的有效手段之一。
如何实现,未完待续…