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

宝德科技专业嘉兴网站建设网站开发维护计入什么费用

宝德科技专业嘉兴网站建设,网站开发维护计入什么费用,pe管网站建设 中企动力,有了域名自己电脑怎么做网站文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案#xff0c;最朴素的方式②、第二种方案#xff0c;重构使得遵循DIP原则#xff1a;③、进一步的小优化#xff1a;④、修改使得支持多个观察者#xff1a; 4、结… 文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案最朴素的方式②、第二种方案重构使得遵循DIP原则③、进一步的小优化④、修改使得支持多个观察者 4、结构 总结 前言 一、“组件协作” 模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”“组件协作” 模式通过晚期绑定来实现框架与应用程序之间的松耦合是二者之间协作时常用的模式。典型模式 Template MethodObserver / EventStrategy 二、Observer 观察者模式 1、动机 在软件构建过程中我们需要为某些对象建立一种“通知依赖关系”——一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知。如果这样的依赖关系过于紧密将使软件不能很好地抵御变化。使用面向对象技术可以将这种依赖关系弱化并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 2、模式定义 定义对象间的一种一对多变化的依赖关系以便当一个对象(Subject)的状态发生改变时所有依赖于它的对象都得到通知并自动更新。 3、伪代码示例 需求在一个文件分割器的项目上增加分割文件时进度条的展示 ①、第一种方案最朴素的方式 FileSplitter1.cpp //FileSplitter1.cpp class FileSplitter {string m_filePath;int m_fileNumber;ProgressBar* m_progressBar; //注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){//...if (m_progressBar ! nullptr) {m_progressBar-setValue((i 1) / m_fileNumber); // 更新进度条}}} };MainForm1.cpp //MainForm1.cpp 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();} };存在的问题违背了 DIP 原则如果 A 依赖于 B ——编译时“依赖”即 A 编译的时候 B 要存在。 ②、第二种方案重构使得遵循DIP原则 FileSplitter2.cpp //FileSplitter2.cpp class IProgress{ public:virtual void DoProgress(float value)0;virtual ~IProgress(){} };class FileSplitter {string m_filePath;int m_fileNumber;//ProgressBar* m_progressBar; //注ProgressBar是实现细节容易变化。 是个具体通知控件IProgress* m_iprogress; // 抽象通知组件 public:FileSplitter(const string filePath, int fileNumber, IProgress* iprogress;) :m_filePath(filePath), m_fileNumber(fileNumber),m_iprogress(iprogress){}void split(){ //1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;m_iprogress-DoProgress(progressValue); //更新进度条}} };MainForm2.cpp //MainForm2.cpp 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());FileSplitter splitter(filePath, number, this); splitter.split();}virtual void DoProgress(float value) {progressBar-setValue(value);} };方案一是直接去控制进度条方案二是给你一个接口我会通过这个接口告诉你现在的进度但是你怎么显示这个进度就看你接口内部的具体实现 ③、进一步的小优化 FileSplitter2.cpp //FileSplitter2.cpp class IProgress{ public:virtual void DoProgress(float value)0;virtual ~IProgress(){} };class FileSplitter {string m_filePath;int m_fileNumber;//ProgressBar* m_progressBar; //注ProgressBar是实现细节容易变化。是个具体通知控件IProgress* m_iprogress; // 抽象通知组件 public:FileSplitter(const string filePath, int fileNumber, IProgress* iprogress;) :m_filePath(filePath), m_fileNumber(fileNumber),m_iprogress(iprogress){}void split(){//1.读取大文件//2.分批次向小文件中写入for (int i 0; i m_fileNumber; i){//...float progressValue m_fileNumber;progressValue (i 1) / progressValue;onProgress(progressValue); }} protected:virtual void onProgress(float value) { // 以供子类去改写if (m_iprogress ! nullptr) {m_iprogress-DoProgress(value);//更新进度条}} };目前的实现只能支持一个观察者此处就是MainForm。 ④、修改使得支持多个观察者 需求在已支持进度条展示的文件分割器的项目上增加一个分隔文件时打点的操作 FileSplitter3.cpp //FileSplitter3.cpp 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.add(iprogress);}void removeIProgress(IProgress* iprogress){m_iprogressList.remove(iprogress);}protected:virtual void onProgress(float value){ListIProgress*::iterator itor m_iprogressList.begin();while (itor ! m_iprogressList.end() )(*itor)-DoProgress(value); //更新进度条itor;}} };MainForm3.cpp //MainForm3.cpp 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);// MainForm 是子类this 指向该类addIProgress 的参数是个基类指针基类指针可以指向派生类对象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 .;} };4、结构 【注】 Observer 对应于 IProgressUpdate() 对应于 DoProgress()Attach 对应于 addIProgressDetach 对应于 removeIProgressNotify 对应于 onProgress, GOF 中建议将这三个方法提出来放到一个父类中其他的 Subject 继承它但是此处我们没有将它提出来ConcreteSubject 就是 FileSplitter具体的被观察者ConcreteObserver 对应于 MainForm 和 ConsoleNotifier具体的观察者。稳定的Subject、Observer变化的ConcreteSubject、ConcreteObserver 总结 使用面向对象的抽象Observer 模式使得我们可以独立地改变目标被观察者与观察者从而使二者之间的依赖关系达致松耦合。目标被观察者发送通知时无需指定观察者通知可以携带通知信息作为参数会自动传播。观察者自己决定是否需要订阅通知目标对象对此一无所知。Observer 模式是基于事件的 UI 框架中非常常用的设计模式也是 MVC 模式的一个重要组成部分。 我的qq2442391036欢迎交流
http://www.hkea.cn/news/14365807/

相关文章:

  • 大连外贸网站建设郑州网站高端网站设计
  • 国外最炫酷网站旅游网站的首页怎么做
  • 做钓鱼网站要具备什么提供佛山顺德网站建设
  • 企业网站空间买虚拟主机竞价网站建设
  • 冀州网站建设价格婚纱网站设计目标
  • 单招网是哪个网站制作公司做的网络推广客户渠道
  • 遵义公司网站搭建多少钱wordpress 4
  • 免费建手机商城网站吗杭州手机模板建站
  • 玖壹购网站是做啥子的泽库网站建设公司
  • 企业网站排名技巧网站一直百度上搜不到是怎么回事啊
  • 做造价在哪个网站查价格如何做游戏渠道网站
  • 企业网官方网站2网站建设
  • 企业建设网站的目的是什么幻灯片模板
  • 高密微网站建设廊坊网络推广公司
  • 学做网站买什么样的书个人网站做淘宝客犯法吗
  • 网站之间如何交换友情链接制作表白网站的软件
  • 如何建立公司网站招标东莞网站制作推广公司
  • 蓝图网站建设广州网站建设公司好吗
  • 做网站需要买什么东莞网站建设实例分析
  • 义乌网站建设公司价位icp备案管理系统官网
  • 腾讯微校怎么做微网站爱企查注册公司
  • 毕业设计网站论文太原建站网页建设
  • 新沂网站建设建筑企业公司
  • 自适应企业网站写一个小程序多少钱
  • 怎么做招投标网站中国营销型网站
  • 图书馆网站建设工作总结做外贸用什么平台
  • 北京网站制作闪快手机便宜电商网站建设
  • 电子商务如何做网站销售为什么不建议去外包公司上班
  • 平顶山市哪里有做网站的半岛网
  • 郑州做公司网站彩票网站开发制作h5