欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > asp.net >内容正文

asp.net

设计模式理解:观察者模式 -ag凯发k8国际

发布时间:2024/10/14 asp.net 24 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 设计模式理解:观察者模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

    观察者模式,对象行为型模式,又称为依赖模式,发布订阅模式。当一个对象状态发生改变时,通过通知的形式,让依赖于它的多个对象自动得进行更新。例如java中的listener ,c#中的event。 

    在合理的依赖关系中,下层结构不应该依赖于上层结构。但是在某些情况中,需要从底层的方法将上层的对象进行更新。一般的解决方式是将上层的对象以参数的形式不断的传递到底层,而观察者模式中,在底层方法里发出通知到接口中,而上层对象通过对接口的实现,将内容更新至其属性里。

    在案例中,有一个复制大文件时更新进度条进度的 需求。

class filecopy{string srcpath;string dispath;progressbar * progressbar;public:filecopy(string s,string d,progressbar & p):filepath(s),dispath(d),progressbar(p){}void copy(){//1 创建目标文件,读取源文件disfile =createfile(dispath)srcfile =readfile(srcpath)....double totalsize = srcfile.totalsize();double sum = 0;while(content=srcfile.readline()){//按行写入文件disfile.write(content);//写文件后更新进度条sum =content.size;progressbar->setvalue(sum/totalsize);}} }//------------界面--------------- class mainform { progressbar bar; public:void button_click(){ //.....filecopy fc(srcfile,disfile,&bar);fc.copy();} }

上述的代码设计中,虽然实现了功能,但弊端是显而易见的。

1.下层的filecopy 依赖于上层 mainform的对象,filecopy类无法复用于控制台,网页等其他项目工程

2.当需求变为“不用进度条显示进度,改用label直接以百分比展示进度”,那么自上而下的要把对象类型进行改造,并且progressbar有setvalue方法,而其他控件可能没有。改造起来复杂度高。

3.这个方法当前只能支持一个进度条,如果想要支持多个不同的控件,那就只能要扩展参数,可维护性会变差。

在如下代码中,展示了以观察者模式的模式设计实现相同的需求。摆脱了底层依赖于高层,达到稳定与变化的分离,可以将类和接口原封不动地应用与其他项目。提高的了代码的复用性,易维护性,易扩展性。 以通知地形式,开放通知接口,让应用程序去实现该接口达到更新进度条的目的。

//通知接口 class inotice{virtual void notify(double)=0; } class filecopy{string srcpath;string dispath;vector notices; //通知对象集合public:filecopy(string s,string d):filepath(s),dispath(d){}void add(inotice * in){notices.push_back(in);}void copy(){//1 创建目标文件,读取源文件disfile =createfile(dispath)srcfile =readfile(srcpath)....double totalsize = srcfile.totalsize();double sum = 0;while(content=srcfile.readline()){//按行写入文件disfile.write(content);//写文件后更新进度条sum =content.size;//给所有依赖发出通知copynotify(sum/totalsize);}}protected:void copynotify(double value){for(notice :notices){notice->notify(value);}} }//------------界面,实现inotice接口方法--------------- class mainform:public inotice{ progressbar bar; public:void button_click(){ //.....childform *cform = new childform ();filecopy fc(srcfile,disfile);fc.add(this);fc.add(cform );fc.copy();}virtual void notify(double value){bar.setvalue(value);} }class childform:public inotice{label label;virtual void notify(double value){bar.settitle(value);} }

 

 

总结

以上是ag凯发k8国际为你收集整理的设计模式理解:观察者模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图