海阔天空

海阔凭鱼跃 天高任鸟飞

 

结构型模型Bridge

在平时的工作中,经常会遇到这样一种情形:一个功能需求,但是可能会根据不同的情况有多种实现方式。
比如:我们想制作一个音乐格式转换工具,需要把mp3音乐的格式转换为wav,或者rm格式,或者以后还会增加其他的格式转换需求。
根据软件开发的设计宗旨:高内聚;低耦合;隔离变化。
我们可以这样来设计,做一个frame实现基本的界面和格式转换调用,我们希望根据用户的选择在框架只调用一个FormatChange接口就可以实现格式转换。
这样我们可以通过结构型模型Bridge来实现这个调用。模型参考如下:



首先,设计一个接口实现音乐格式的转换,名字叫IChangeMusicFormat,定义一个纯虚函数,名字叫FChange()。

然后,定义两个由接口IChangeMusicFormat派生的类,
一个用于mp3到wav的转换,名字叫CMp32WavFormat,重载FChange实现mp3到wav的音乐格式转换;
一个用于mp3到rm的转换,名字叫CMp32RmFormat,重载FChange实现mpe到rm的音乐格式转换。
以后如果需要增加mp3对其他音乐格式的转化,只需要从IChangeMusicFormat派生出相关的类来实现。

第三步,定义一个抽象的调用接口,来实现对IChangeMusicFormat的调用。接口名叫做ICallChangeFormat;定义一个纯虚函数,名字叫FormatChange();并使用IChangeMusicFormat来定义一个数据成员指针,用于调用其子类的FChange接口;

第四步,子类化IChangeMusicFormat接口,名字叫CChangeFormat,通过构造函数或者其他方式将一个IChangeMusicFormat指针传递给CChangeFormat中的IChangeMusicFormat数据成员,重载FormatChange实现对IChangeMusicFormat子类中音乐格式转换函数的调用。

最后一步也就是在框架中调用这个接口啦:如实现mp3到wav格式的转换,可以参考如下代码:
#include "CMp32WavFormat.h"
#include "ChangeFormat.h"

IChangeMusicFormat* iChange = new CMp32WavFormat();
IChangeMusicFormat* inst = new CChangeFormat(impA);

inst->FChange();

posted on 2007-08-04 15:26  liuym  阅读(379)  评论(0编辑  收藏  举报

导航