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

宜昌市建设监理协会网站小程序软件开发

宜昌市建设监理协会网站,小程序软件开发,域名查询网138,公需科目在哪个网站做组件协作模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”,“组件协作” 模式通过晚期绑定,来实现框架与应用程序直接的松耦合,是二者之间协作时常用的模式 典型模式 Template Method Strategy Observer /Event 动机(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;List<IProgress*>  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){List<IProgress*>::iterator itor=m_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 << ".";}
};

然后 需要支持多个 List<IProgress*> m_iprogressList; // 抽象通知机制,
支持多个观察者。

完整代码如下:

class IProgress{
public:virtual void DoProgress(float value)=0;virtual ~IProgress(){}
};class FileSplitter
{string m_filePath;int m_fileNumber;List<IProgress*>  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){List<IProgress*>::iterator itor=m_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.yayakq.cn/news/738105/

相关文章:

  • 揭阳东莞网站建设苏州工业园区服务外包职业学院
  • 阿里巴巴网站的功能正规html5网站
  • 网站建设项目规划书社团宣传如何给网站添加音乐
  • 就业网站建设浙江广发建设有限公司网站
  • 最好的flash网站网站搭建备案吗
  • 引导式网站多个域名的网站
  • 合肥金融网站开发开发区是什么意思
  • 2018年网站设计公司网络推广企业营销
  • 班级网站开发报告wordpress 知名网站
  • 做任务兼职赚钱的网站大兴西红门网站建设
  • 网站开发需要什么条件河南省建设工程网站
  • 甘肃住房建设厅网站网站备案怎样提交管局
  • 中山网站建设文化效果加强网站内容建设创新
  • 年度网站建设工作总结查排名
  • 自适应网页模板建站会议室效果图制作
  • 门户网站建设原则点击一个网站跳转到图片怎么做
  • 做英文网站多钱wordpress 菜单颜色
  • 电商网站开发可行分析wordpress页面透明度
  • 青岛平台网站建设专业个人网站建设
  • 网站建设与管理升学就业方向有什么好的免费网站做教育宣传语
  • 小贷网站需要多少钱可以做淘宝客做自己的网站
  • 信息网站建设费使用年限工程项目管理系统
  • 百度移动网站排名重庆网络问政平台
  • 珠海斗门建设局官方网站做交网站
  • 整网站代码 带数据 免费 下载做景观设施的网站
  • 网站建制作公司网站建设服务公司哪家好
  • 金山企业型网站建设店铺推广软文300字
  • 梅州建站做ppt模板网站有哪些
  • 如何做好一个外贸进网站的编辑国内做心理咨询师培训出名的网站
  • 外贸网站建设渠道wordpress回复微信查看