C++面向对象编程分享09----20160429_设计模式_李楚煌
2016-04-29 16:30
369 查看
namespace { public MainForm() { InitializeComponent(); string srcSplFilename = null; //记录源文件路径 string desSplFilename = null; //记录存储路 } private void btnSource_Click(object sender, EventArgs e) { OpenFileDialog openDlg = new OpenFileDialog(); if (openDlg.ShowDialog() == DialogResult.OK && openDlg.FileName != string.Empty) { srcSplFilename = openDlg.FileName; //记录源文件的存储路径 } } if (folderDlg.ShowDialog() == DialogResult.OK) { { //以源文件路径对应的字符串和Open文件打开模式初始化FileStream文件流实例 splitFileStream = new FileStream(srcSplFilename, FileMode.Open); //以FileStream文件流来初始化BinaryReader文件流实例 splitFileReader = new BinaryReader(splitFileStream); //获取分割后所得到的小文件的总数 desFileSize = int.Parse(cboSize.SelectedItem.ToString()) * 1024 ; desFileCount = (int)(splitFileStream.Length / desFileSize); if (splitFileStream.Length % desFileSize != 0) desFileCount++; //数组desExtra的最后一个元素为源文件的扩展名,也即新文件扩展名 desExtra = srcSplFilename.Split('.'); //获取源文件的文件名 filename = srcSplFilename.Substring(srcSplFilename.LastIndexOf("\\") + 1, srcSplFilename.LastIndexOf(".") - (srcSplFilename.LastIndexOf("\\") + 1)); //设置进度条空间的Maximum属性 progBarSplit.Maximum = desFileCount - 1; //循环处理,依次将大文件分割成多个小文件 While(desFileCount 1= 0){ //确定小文件的文件名称 string desFileName = @desSplFilename + @"\" + filename + i.ToString().PadLeft(4, '0') + "." + desExtra[desExtra.Length - 1]; //关闭相应目的文件流实例 desFileStream.Close(); } //关闭源文件流实例 splitFileReader.Close(); splitFileStream.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } srcPath=openDlg.FileName.Split(@"\".ToCharArray()); for (i = 0; i < srcPath.Length - 1; i++) { strTemp = strTemp + srcPath[i] + @"."; } srcMerFilename = strTemp; //获取文件所在目录 filename = srcPath[srcPath.Length - 1].Split(@".".ToCharArray()); for (i = 0; i < filename.Length - 1; i++) { fileName = fileName + filename[i] + @"."; } fileName = fileName.Substring(0,fileName.Length - 1); //获得文件名 fileExtra = filename[filename.Length - 1]; //获得文件扩展 } private void btnMergDes_Click(object sender, EventArgs e) { FolderBrowserDialog folderDlg = new FolderBrowserDialog(); folderDlg.Description = "请选择目的文件存放的文件夹"; private void btnMerge_Click(object sender, EventArgs e) { string filename = ""; string[] arrFileNames; //记录所有分割后得到的所有小文件的名称 if (srcReader != null) srcReader.Close(); txtMerSrc.Clear(); txtMergDes.Clear(); srcMerFilename = null; desMerFilename = null; fileName = ""; fileExtra = ""; } } }
设计模式分为:策略模式、观察者模式、装饰模式、桥模式、门面模式、代理模式、原型模式
而方法有模板方法、工厂方法,
这些的内核在于我之前分享的C++的三把大刀:复合、继承、委托:
http://blog.csdn.net/a759460146/article/details/50914027
今天先讲讲创建型模式:
第一个: Simple Factory Pattern
一个软件提供多个外观不同的按钮,按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性
从而使得它们可以呈现不同的外观,
如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,
并提供一个调用方便的方法,把该参数传入方法返回一个相应的按钮对象,这就是简单工厂模式。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来相对容易。
在调用工厂类的工厂方法时,可通过类名直接调用,而且只需要传入一个简单的参数即可,在
实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,
修改参数时不用修改任何源代码。
这是基础的设计模式,后续会有所补充。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性