如此功能组合大杂烩该用什么设计模式呢?

辉歌 2005-03-23 11:31:02
我正在用DirectShow做一个播放器。如何使用DirectShow做一个媒体播放器我已经知道了。基本思路就是通过CoCreateInstanc(CLSID_FilterGraph.....)得到一个 IGraphBuilder* 的接口指针,通过该指针,我们能得到其他的媒体控制功能接口指针。如:

m_pGraphBuilder->QueryInterface(IID_IMediaControl,(void**)&m_pMeidaControl));

得到了IMediaControl* m_pMediaControl接口指针。通过该接口,可以控制媒体的播放,停止,暂停等等:
m_pMediaControl->Run();
m_pMediaControl->Stop();
m_pMediaControl->Pause();

同样的,对于视频方面的控制,如全屏控制等,需要从IGraphBuilder* m_pGraphBuilder接口获得IVideoWindow接口。得到该接口后,用接口提供的函数控制全屏;对于音频方面的,同样从IGraphBuilder* m_pGraphBuilder接口获得一个接口,控制音频......

这些我都明白了。能做出一个媒体播放器来了。

但是我最近在学习设计模式,考虑到现在我使用的方法:

1,将各功能接口用一个类来封装起来,如:
class CVideoControl
{
private:
IVideoWindow* m_pVW;
public:
void SetFullScreen(BOOL b);
long GetFullScreen();
......
};

class CAudioControl
{
private:
IBasicAudio* m_pBA;
public:
void putVolume(long x);
void mute();
....
};


......

2,在CPlayer中,将这些类组合起来:
class CPlayer
{
private:
CVideoControl* m_pVC;
CAudioControl* m_pAC;
....
public:
void SetFullScreen(BOOL b);
long GetFullScreen();
void putVolume(long x);
void mute();
};

然后将各接口方法委托给各相关类去完成。


按照这个思路,现在的程序工作起来很正常。但是,这时候,组长要求我能添加一个新的功能,能得到当前播放的视音频信息,即播放速率等等之类的,一样,又需要将某个接口封装成一个类,将其加入到CPlayer中去。添加方法,委托给这个类。

我感觉这个很麻烦,是我的设计有问题了吧?所以想请大家帮帮忙,该应用那个设计模式比较合适这个现象?



同样的问题见:
http://community.csdn.net/Expert/topic/3843/3843495.xml?temp=.3564569

只是这些回答都牛头不对马嘴。
...全文
441 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
勉励前行 2005-06-09
  • 打赏
  • 举报
回复
用代理模式.class CPlayer為代理。
各功能類要向CPlayer注冊對應的函數及功能說明。這樣子功能增加了,代理會自動處理,不用改代碼。

但你原來的程序將會做大改動。

mostideal 2005-06-08
  • 打赏
  • 举报
回复
帮顶。。
xt_jat 2005-05-19
  • 打赏
  • 举报
回复
你应该这样

class CPlayer

class CVideoControl : public CPlayer
class CAudioControl : public CPlayer
robothn 2005-04-23
  • 打赏
  • 举报
回复
什么都不用,随时查询要使用的接口并调用其方法
DShow 里的一个GraphBuilder接口那么多,都这样封装,够你头疼的
alextooter 2005-04-16
  • 打赏
  • 举报
回复
各种媒体内容应该统一起来,就一个media类型,这个对象应该含有播放,
暂停等功能,在这个对象的内部,可以分成video型的和audio型的或者其他的
什么类型。
alextooter 2005-04-16
  • 打赏
  • 举报
回复
我的一点想法,媒体内容当作一个对象,这个对象要对自己负责,就是说,它有播放自己的
责任,提供自己的信息的责任,至于DirectShow,只是你调用的一层接口,应该封装起来,
不应该提供出来,例如以后用别的方式播放了,那么这些类是不是还要重写呢?(不定什么时候
微软就换方式了,应该用bridge模式把DirectShow隐藏了)。
jingyueid 2005-04-10
  • 打赏
  • 举报
回复
应该是写在Video中,做为video的对外接口。

PD的意思想是尽量的代码重用,但如果没有这个功能的话,它也必须写啊,关键是功能要低耦合。
suyun9329 2005-04-06
  • 打赏
  • 举报
回复
up
aweto 2005-04-01
  • 打赏
  • 举报
回复
信息显示还可以在对应的control里面写,在player接口中调用。
MagicCarmack 2005-03-26
  • 打赏
  • 举报
回复
顶一下,希望楼主早日解决问题!
dongpy 2005-03-26
  • 打赏
  • 举报
回复
在CPlayer中添加一个接口函数很麻烦吗?
lengyuye2005 2005-03-23
  • 打赏
  • 举报
回复
CVideoControl的函数里面如果没有自己的业务逻辑或者这些逻辑不会改变,只是写了一些com接口的函数调用。那么就没有必要用一个类去封装一个接口了。

直接在CPlayer的对应函数中做就可以了,因为IVideoWindow接口已经是经过封装的了。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧