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

电商网站设计的流程专门做女频的小说网站

电商网站设计的流程,专门做女频的小说网站,c做项目的网站,管理咨询网站建设组件协作模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”,“组件协作” 模式通过晚期绑定#xff0c;来实现框架与应用程序直接的松耦合#xff0c;是二者之间协作时常用的模式 典型模式 Template Method Strategy Observer /Event 动机#xff08;M…组件协作模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”,“组件协作” 模式通过晚期绑定来实现框架与应用程序直接的松耦合是二者之间协作时常用的模式 典型模式 Template Method Strategy Observer /Event 动机Motivation 在软件构建过程中我们需要为某些对象建立一种通知依赖关系 一个对象(目标对象)的状态发生改变,所有的依赖对象观察者对象都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。 使用面向对象技术可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 假定场景: 当前做一个文件的分割器将大的文件分割成多个文件。 首先有一个界面MainForm 就是一个界面。 class MainForm : public Form {TextBox* txtFilePath; // 文件路径TextBox* txtFileNumber; // 希望分割的文件个数 public:void Button1_Click(){// 接收用户传进来的两个信息string filePath txtFilePath-getText();int number atoi(txtFileNumber-getText().c_str());FileSplitter splitter(filePath, number);splitter.split(); // 调用split方法} }; class FileSplitter {string m_filePath; // 文件路径int m_fileNumber; // 文件个数ProgressBar* m_progressBar;public:FileSplitter(const string filePath, int fileNumber, ProgressBar* progressBar) :m_filePath(filePath), m_fileNumber(fileNumber),m_progressBar(progressBar){}void split(){//1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;m_progressBar-setValue(progressValue);}} }; 当前文件如果处理特别大的文件那么就需要给用户一个进度条首先需要在界面 MainForm 中添加进度条控件 ProgressBar* progressBar; 在使用中 Button1_Click 传入当前进度条.最终在实际操作中 FileSplitter 函数 split 内部计算并设置进度条 m_progressBar-setValue(progressValue); 如下代码所示: class MainForm : public Form {TextBox* txtFilePath; // 文件路径TextBox* txtFileNumber; // 希望分割的文件个数ProgressBar* progressBar;public:void Button1_Click(){// 接收用户传进来的两个信息string filePath txtFilePath-getText();int number atoi(txtFileNumber-getText().c_str());FileSplitter splitter(filePath, number, progressBar);splitter.split(); // 调用split方法} };// class FileSplitter {string m_filePath;int m_fileNumber;ProgressBar* m_progressBar;public:FileSplitter(const string filePath, int fileNumber, ProgressBar* progressBar) :m_filePath(filePath), m_fileNumber(fileNumber),m_progressBar(progressBar){}void split(){//1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;// 更新进度条if(nullpt ! m_progressBar)m_progressBar-setValue(progressValue);}} }; 上述方法违背了依赖倒置设计原则高层模块不能依赖底层模块二者都应该依赖于抽象抽象不能依赖于实现细节实现细节应该依赖于抽象。 如果当前 它不是UI程序而是控制台程序那么 ProgressBar* m_progressBar;这行代码可能并不能适用于别的显示进度方式。 新的方式 首先做一个抽象的通知 class IProgress{ public:virtual void DoProgress(float value)0;virtual ~IProgress(){} };然后将 FileSplitter 中的具体通知控件 ProgressBar* m_progressBar; 替换成抽线通知机制 IProgress* iprogress class IProgress{ public:virtual void DoProgress(float value)0;virtual ~IProgress(){} };class FileSplitter {string m_filePath;int m_fileNumber;ListIProgress* m_iprogressList; // 抽象通知机制支持多个观察者public:FileSplitter(const string filePath, int fileNumber) :m_filePath(filePath), m_fileNumber(fileNumber){}void split(){//1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;onProgress(progressValue);//发送通知}}void addIProgress(IProgress* iprogress){m_iprogressList.push_back(iprogress);}void removeIProgress(IProgress* iprogress){m_iprogressList.remove(iprogress);}protected:virtual void onProgress(float value){ListIProgress*::iterator itorm_iprogressList.begin();while (itor ! m_iprogressList.end() )(*itor)-DoProgress(value); //更新进度条itor;}} }; 然后在 UI 中进行多继承 class MainForm : public Form, public IProgress 并且实现 virtual void DoProgress(float value){progressBar-setValue(value);}其实如果再添加一个控制台的程序,打印进度的也好添加 class ConsoleNotifier : public IProgress { public:virtual void DoProgress(float value){cout .;} };然后 需要支持多个 ListIProgress* m_iprogressList; // 抽象通知机制 支持多个观察者。 完整代码如下 class IProgress{ public:virtual void DoProgress(float value)0;virtual ~IProgress(){} };class FileSplitter {string m_filePath;int m_fileNumber;ListIProgress* m_iprogressList; // 抽象通知机制支持多个观察者public:FileSplitter(const string filePath, int fileNumber) :m_filePath(filePath), m_fileNumber(fileNumber){}void split(){//1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;onProgress(progressValue);//发送通知}}void addIProgress(IProgress* iprogress){m_iprogressList.push_back(iprogress);}void removeIProgress(IProgress* iprogress){m_iprogressList.remove(iprogress);}protected:virtual void onProgress(float value){ListIProgress*::iterator itorm_iprogressList.begin();while (itor ! m_iprogressList.end() )(*itor)-DoProgress(value); //更新进度条itor;}} }; /// class MainForm : public Form, public IProgress {TextBox* txtFilePath;TextBox* txtFileNumber;ProgressBar* progressBar;public:void Button1_Click(){string filePath txtFilePath-getText();int number atoi(txtFileNumber-getText().c_str());ConsoleNotifier cn;FileSplitter splitter(filePath, number);splitter.addIProgress(this); //订阅通知splitter.addIProgress(cn) //订阅通知splitter.split();splitter.removeIProgress(this);}virtual void DoProgress(float value){progressBar-setValue(value);} };class ConsoleNotifier : public IProgress { public:virtual void DoProgress(float value){cout .;} }; 总结 使用面向对象的抽象Observer 模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合目标发送通知时无需指定观察者通知可以携带通知信息作为参数会自动传播。观察者自己决定是否需要订阅通知目标对象对此一无所知。Observer 模式是基于事件的UI框架中非常常用的设计模式也是MVC模式的一个重要组成部分。
http://www.dnsts.com.cn/news/44189.html

相关文章:

  • 晋城市企业网站怎么将网站做成公司官网
  • 如何提升网站的搜索排名搜索引擎关键词排名
  • 汕头网站推广seo活动推广
  • 外贸自建零售网站做仿牌织梦的官方网站
  • 网站服务器租赁需要什么手续品牌网店怎么加盟
  • 做网站把自己做死惠州网站推广
  • 景德镇网站网站建设全球新冠死亡人数
  • 甘肃省建设厅安全员官方网站网站设计推广方案
  • 房地产行业最新消息某一网站seo策划方案
  • 网站招商页面怎么做外贸网站 wordpress
  • 网站建设销售实习报告安卓开发课程
  • 一个旅游网站怎么做网站建设的法律问题
  • 广东省住房建设厅网站做彩铃的网站
  • 花生壳做网站是否稳定软文推广公司
  • 户外网站模板南宁seo教程
  • 网站欢迎屏怎么做写作网站水平哪个最好
  • 上海网站建站模板做代码和网站
  • 个人做电商网站赚钱吗seo入门黑帽培训教程
  • 如何做网站搜索排名沈阳app开发公司哪家好
  • 南京百度推广网站国有平台公司是什么意思
  • 物流网站系统php源码微信公众号如何创建视频链接
  • 深圳市住房建设部网站wordpress视频防止下载文件
  • 网站不收录专业团队的重要性
  • 做外贸网站需要缴什么税html注册登录模板
  • 湛江制作网站多少钱公司门户网站及oa系统建设的请示
  • 教学网站开发背景西安官网seo诊断
  • 广州企业所得税河北seo网站优化公司
  • 建个网站多少钱app贵州省住房和城乡建设厅网站官网
  • 网站建设服务标准深圳罗湖网站制作
  • 做企业福利网站起名怎么做公司网站的二维码