`
prowl
  • 浏览: 80673 次
  • 性别: Icon_minigender_1
  • 来自: 艾泽拉斯
社区版块
存档分类
最新评论

结合策略模式谈谈抽象类与接口

阅读更多
最近工作中有这样一个场景:

一个解析器,,处理不同的音/视频文件。刚开始我选择了策略模式,照搬书上的样例如此设计类图:



MediaHandler作为一个处理的类,里面包含一个Parser接口类型的变量。(其实MediaHandler也是作为某接口类型的实现类,这里省略)

后来我发现在各个Parser的实现中有一些公共的代码,所以我把它们抽象,提取了一个AbstractParser。



这样感觉好多了,可在接口-抽象类-POJO之间,还是总感觉不太对劲。

简单说一下实际的功能:(如下图接口定义)

1.接口定义了一个方法,提取文件某时间区间的字节流

2.抽象类实现了这个方法,定义了一个新的抽象方法,解析多媒体信息计算起止位置(读取文件用)。

3.具体实现类是分别针对不同的多媒体文件对多媒体信息进行分析,计算截取文件的起止位置。

public interface Parser {
	
	/**
	 * 抽取相关时间区间内的多媒体字节流
	 */
	ExtractResultV2 getSection(ExtractParamV2 para,String suffix);

}



最后做了如下修改:



这里我修改了一下类名,可能会有更有助于理解。

MediaHandler里的属性我改为了parser:AbstractParser

几个具体的类实现ParserMediaInfoAble接口,用于解析音/视频信息。

----------------------

总结了一下,因为单继承,抽象类与具体类之间有严格的继承关系,遵循“is a”的思想。而接口更多的注重表达此类的一种能力,上例就是重在描述此解析器有分析多媒体信息的能力。

至于策略模式,无所谓属性是接口类型还是抽象类。当然接口的用途不完全于此,例如代理模式。

各位还有没有比较好的想法和意见,欢迎补充/指正。

  • 大小: 34.8 KB
  • 大小: 36.4 KB
  • 大小: 42.2 KB
分享到:
评论
2 楼 21131833 2010-03-08  
首先,我先说这个功能的一个理解。

第一,AbstractPaser中含有实现功能的部分代码,所以它只能是抽象类,不能是接口。
第二,其他继承AbstractPaser的类含有剩下的部分代码,它和AbstractPaser类一起实现一个解析的功能。

剩下的就是那个接口和MediaHandler了,接口好理解,定义“剩下的部分代码”

关键是MediaHandler,它包含一个属性或引用。
它的类型你写的是-AbstractPaser我觉得是-PaserMediaInfoAble的话,会不会好一点呢?!

我对你的MediaHandler类的作用不太了解。不确定它返回解析类,还是返回解析结果,
还是其它什么?

1 楼 langyu 2009-11-03  
这个问题是否可归结于在设计类层次时,使用接口还是抽象类更好些?

相关推荐

    第14讲 谈谈你知道的设计模式1

    - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - 单例模式(Singleton):保证一个类只有一个实例,并提供全局访问点。 - 构建器模式(Builder)...

    C#设计模式_11138467

    在C#中,策略模式可以结合接口或抽象类来实现,使得代码更加灵活,易于扩展。 最后,适配器模式是一种结构型设计模式,它能使两个不兼容的接口协同工作。C#中的适配器模式可以通过类适配器或对象适配器来实现,帮助...

    设计模式(Java 与模式-笔记 二)

    本文主要关注的是Java编程语言中的设计模式,结合“Java与模式-笔记二”的博客内容,我们将深入探讨其中的一些核心设计模式及其在实际开发中的应用。 首先,我们来谈谈单例模式(Singleton)。单例模式确保一个类...

    java与模式

    设计模式分为三类:创建型模式(如单例模式、工厂模式、建造者模式、原型模式)、结构型模式(如适配器模式、桥接模式、装饰器模式、外观模式、组合模式、代理模式)和行为型模式(如策略模式、观察者模式、责任链...

    三层+抽象工厂(连接Msql数据库和SqlServer2005数据库)

    接下来,我们谈谈抽象工厂模式。抽象工厂是设计模式的一种,主要用于创建相关或依赖对象的家族,而无需指定它们的具体类。在连接不同类型的数据库时,如MySQL和SQL Server,抽象工厂可以帮助我们创建适配特定数据库...

    java后端面试问题整理

    - 阐述抽象类和接口的区别。 - 何时应该使用final关键字? - 介绍单例设计模式并给出线程安全的实现方式。 - 解释工厂方法模式和抽象工厂模式的应用场景。 3. **多线程与并发** - 什么是线程安全?举例说明。 ...

    数据层 万能实体类方法

    总结来说,"数据层万能实体类方法"是一种提高代码效率和可维护性的设计策略,通过抽象出通用的数据库操作接口,降低了代码重复度,使得数据层的开发更加简洁高效。配合ORM框架,可以进一步简化数据库操作,让开发者...

    .NET常见面试题目大全

    - 什么是抽象类和接口,它们的区别是什么? - C#中的访问修饰符有哪些,分别代表什么意思? - 介绍C#中的异常处理机制,如何使用try-catch-finally语句? 3. **面向对象编程** - 阐述封装、继承和多态在面向...

    代码性能Java比较

    6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,适配器可以帮助不同接口的类协同工作。 7. **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Java...

    clean-ts-api:API em NodeJs使用脚本,TDD,Clean Architecture,设计模式和SOLID原则

    设计模式是解决特定软件设计问题的常见解决方案,比如单例模式、工厂模式、策略模式等。在`clean-ts-api`项目中,可能运用了如依赖注入、装饰者模式等,这些模式使得代码更灵活,降低了耦合度,增强了系统的可扩展性...

    Java框架面试题总结

    Tiles框架通常与Struts框架结合使用,用来定义页面布局和组织页面结构。 **11. Struts1.x和Struts2的区别** - **架构差异**:Struts2采用了拦截器栈模型,而Struts1则采用了传统的MVC模式。 - **配置方式**:...

    C#微软培训资料

    15.5 抽象类与接口 .195 15.6 小 结 .196 第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 结 .213 第十七章 文 件 ...

Global site tag (gtag.js) - Google Analytics