当前位置: 首页 > news >正文

结构型模型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();

转载于:https://www.cnblogs.com/zkliuym/archive/2007/08/04/842939.html

相关文章:

  • PHP实现程序单例执行
  • Visual C#.Net网络程序开发-Tcp篇(3)
  • [New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘
  • ajax.net 我曾经轻视了他,郁闷。
  • 彻底去除Win10“快速访问”
  • 网络服务器时间发布地址
  • 《Python地理数据处理》——2.3 变量
  • 只能使用数组初始值设定项表达式为数组类型赋值。请尝试改用新的表达式
  • 《Total Commander:万能文件管理器》——12.3.高人高见
  • 在C#中应用哈希表(Hashtable)
  • 《Python数据可视化编程实战》——5.2 创建3D柱状图
  • c#.net中参数修饰符ref,out ,params的区别
  • 《JavaScript设计模式》——9.10 Factory(工厂)模式
  • 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • webgis实现技术分析
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2019年如何成为全栈工程师?
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • isset在php5.6-和php7.0+的一些差异
  • Markdown 语法简单说明
  • Spark RDD学习: aggregate函数
  • storm drpc实例
  • Vue2 SSR 的优化之旅
  • 笨办法学C 练习34:动态数组
  • 机器学习中为什么要做归一化normalization
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端技术周刊 2019-02-11 Serverless
  • 前端之React实战:创建跨平台的项目架构
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我有几个粽子,和一个故事
  • 一、python与pycharm的安装
  • 硬币翻转问题,区间操作
  • 函数计算新功能-----支持C#函数
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (算法)前K大的和
  • (五)Python 垃圾回收机制
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)jQuery 基础
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net 后台导出excel ,word
  • .net连接oracle数据库
  • @Bean有哪些属性
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [1159]adb判断手机屏幕状态并点亮屏幕