用事例说明多态

多态

定义
同一操作作用于不同的实例,产生不同运行结果的机制。

场景
小王准备开发一个万能加载器,为爷爷提供便捷的操作,快速的打开电脑中指定的文件。
万能加载器需求点:
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、由于系统没有分割和规划,几乎不能实现任何简单的扩展和维护。
需求变更是结构设计的大敌,实现灵活扩展和简单变更的设计构思,是面向对象的有效手段之一。

如何实现,未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值