- 浏览: 767848 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
MVC是一种复合模式,结合了观察者,策略模式和组合模式。
要点:
1.模型使用观察者模式,以便观察者更新,同时保持两者之间解耦。
2.控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。
3.视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板,框架和按钮。
4.这些模式携手合作,把MVC模型的三层解耦,这样可以保持设计干净又有弹性。
5.适配器模式用来将新的模型适配成已有的视图和控制器
model.h
NumObserver.h
NumWidgetViewer.h
NumWidgetViewer.cpp
NumController.h
NumController.cpp
main.cpp
要点:
1.模型使用观察者模式,以便观察者更新,同时保持两者之间解耦。
2.控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。
3.视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板,框架和按钮。
4.这些模式携手合作,把MVC模型的三层解耦,这样可以保持设计干净又有弹性。
5.适配器模式用来将新的模型适配成已有的视图和控制器
model.h
#ifndef MODEL_H #define MODEL_H #include<list> #include"NumObserver.h" using namespace std; class Model{ private: int number; list<NumObserver*> lst; public: virtual int getNum()const=0; virtual void setNum(int num)=0; virtual void registerObserver(NumObserver* o)=0; virtual void removeObserver(NumObserver* o)=0; virtual void notifyObserver()=0; }; class NumModel:public Model{ private: int number; list<NumObserver*> lst; public: virtual int getNum()const{ return number; } virtual void setNum(int num){ number = num; } virtual void registerObserver(NumObserver* o){ lst.push_back(o); } virtual void removeObserver(NumObserver* o){ lst.remove(o); } virtual void notifyObserver(){ list<NumObserver*>::iterator iter=lst.begin(); while(iter!=lst.end()){ (*iter)->update(number); ++iter; } } }; #endif // MODEL_H
NumObserver.h
#ifndef NUMOBSERVER_H #define NUMOBSERVER_H class NumObserver{ public: virtual void update(int num)=0; virtual int getNum()const=0; }; class Num:public NumObserver{ private: int number; public: void update(int num){ number = num; } int getNum()const{ return number; } }; class DoubleNum:public NumObserver{ private: int number; public: void update(int num){ number = num*2; } int getNum()const{ return number; } }; class SquareNum:public NumObserver{ private: int number; public: void update(int num){ number = num*num; } int getNum() const{ return number; } }; #endif // NUMOBSERVER_H
NumWidgetViewer.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<boost/scoped_ptr.hpp> #include"NumController.h" using namespace boost; class NumController; class NumWidgetViewer : public QWidget { Q_OBJECT public: explicit NumWidgetViewer(NumController* controller,QWidget *parent = 0); ~NumWidgetViewer(); void updateNum(int num,int doubleNum,int squareNum); protected slots: void on_decreaseButton_clicked(); void on_increaseButton_clicked(); private: class NumWidgetViewerUi; scoped_ptr<NumWidgetViewerUi> mui; NumController* mController; }; #endif // WIDGET_H
NumWidgetViewer.cpp
#include "NumWidgetViewer.h" #include "ui_widget.h" class NumWidgetViewer::NumWidgetViewerUi:public Ui::Widget{ }; NumWidgetViewer::NumWidgetViewer(NumController* controller,QWidget *parent): QWidget(parent),mController(controller) { //init viewer mui.reset(new NumWidgetViewerUi); mui->setupUi(this); mui->numEdit->setEnabled(false); mui->DoubleEdit->setEnabled(false); mui->SquareEdit->setEnabled(false); } void NumWidgetViewer::on_decreaseButton_clicked(){ mController->decreaseNum(); update(); } void NumWidgetViewer::on_increaseButton_clicked(){ mController->increaseNum(); update(); } void NumWidgetViewer::updateNum(int num, int doubleNum, int squareNum){ mui->numEdit->setText(QString::number(num)); mui->DoubleEdit->setText(QString::number(doubleNum)); mui->SquareEdit->setText(QString::number(squareNum)); } NumWidgetViewer::~NumWidgetViewer() { }
NumController.h
#ifndef NUMCONTROLLER_H #define NUMCONTROLLER_H #include"Model.h" #include"NumWidgetViewer.h" #include<boost/scoped_ptr.hpp> using namespace boost; class NumWidgetViewer; class NumController{ public: NumController(); void increaseNum(); void decreaseNum(); void setNum(int num); void createView(); private: class NumControllerData; scoped_ptr<NumControllerData> mData; scoped_ptr<NumWidgetViewer> mViewer; }; #endif // NUMCONTROLLER_H
NumController.cpp
#include"NumController.h" #include"NumObserver.h" class NumController::NumControllerData{ public: NumObserver *doubleNum; NumObserver *squareNum; NumObserver *num; Model *model; int number; public: NumControllerData(){ doubleNum = new DoubleNum; squareNum = new SquareNum; num = new Num; model = new NumModel; model->registerObserver(doubleNum); model->registerObserver(squareNum); model->registerObserver(num); } }; NumController::NumController() { //init model mData.reset(new NumControllerData); createView(); } //init viewer void NumController::createView(){ mViewer.reset(new NumWidgetViewer(this)); setNum(10); mViewer->show(); } void NumController::increaseNum() { setNum(mData->model->getNum()+1); } void NumController::decreaseNum() { setNum(mData->model->getNum()-1); } void NumController::setNum(int num) { mData->model->setNum(num); mData->model->notifyObserver(); mViewer->updateNum(mData->num->getNum(), mData->doubleNum->getNum(), mData->squareNum->getNum()); }
main.cpp
#include <QtGui/QApplication> #include "NumController.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); NumController* controller = new NumController; controller->createView(); return a.exec(); }
发表评论
-
桥接模式(Bridge)
2014-09-26 15:34 819桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 837访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 679解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 636享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 444中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 586职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 589合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 432组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 561备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 596委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 566建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 631外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 407迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 512原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 339里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 396依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 563开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 561单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
代理模式(Proxy)
2011-07-19 15:47 929代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ... -
状态模式(State)
2011-07-13 17:33 880状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像 ...
相关推荐
ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比...
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...
**MVC(Model-View-Controller)模式是软件开发中的一种设计模式,尤其在Web应用开发中被广泛应用。C#是Microsoft开发的一种面向对象的编程语言,它与.NET框架紧密结合,支持构建各种类型的应用,包括MVC应用。在这...
ASP.NET MVC5是一个基于微软.NET Framework的开源web应用程序框架,专为构建动态、数据驱动的Web应用程序而设计。它结合了Model-View-Controller(MVC)设计模式、ASP.NET的功能性和HTML5的能力,提供了更高效、灵活...
**MVC模式与Servlet、JSP的协同工作** 在Web应用开发中,Model-View-Controller(MVC)模式是一种广泛采用的设计模式,它将应用程序的业务逻辑、数据和用户界面分离,使得开发和维护更加方便。在这个"经典MVC登录...
C# MVC(Model-View-Controller)经典框架是基于微软.NET平台的一种强大的Web应用程序开发模式。这个框架结合了MVC设计模式的灵活性和C#语言的强类型特性,为开发者提供了构建可维护、高性能和高度分层的Web应用的...
*** MVC 4是一个用于构建可扩展、基于标准的Web应用程序的框架,它使用了众所周知的设计模式,并且充分利用了***和.NET框架的强大功能。*** MVC框架允许开发者使用模型-视图-控制器(Model-View-Controller, MVC)...
MVC2.0入门必读教程程序源码 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了。可以说自动推出以来,一直广受关注。在经历了漫长的Preview之后,前几天终于推出了其beta版。并且在官方文档中,微软...
标题 "PureMVC 中文版" 指的是 PureMVC 框架的一个中文版本,这是一款广泛应用的开源框架,特别设计用于构建富互联网应用程序(RIA),尤其是基于Adobe Flex和ActionScript 3的项目。PureMVC 提供了一种模块化、结构...
ASP.NET MVC是一个强大的框架,用于构建可维护性和灵活性极高的Web应用程序。它是Microsoft为开发者提供的一种基于模型-视图-控制器(MVC)设计模式的工具,使得开发人员能够更清晰地分离业务逻辑、数据处理和用户...
**ASP.NET MVC 5 框架详解** ASP.NET MVC 5 是 Microsoft 推出的一款用于构建可伸缩、高性能的 Web 应用程序的框架,它基于模型-视图-控制器(MVC)设计模式,结合了ASP.NET Web Forms 和 ASP.NET Web API 的优势,...
ASP.NET MVC4(Model-View-Controller)是微软推出的一款用于构建动态网站的开源框架,它基于ASP.NET平台,提供了一种分离关注点、结构清晰的开发模式。在这个"ASP.NET MVC4 安装文件"中,包含了适用于Visual Studio...
ASP.NET MVC4 CMS 是一个基于微软的ASP.NET MVC4框架构建的内容管理系统,它提供了一种高效、可扩展的方式来管理和展示网站内容。MVC(Model-View-Controller)设计模式是其核心,它将应用程序分为三个主要组件:...
ASP.NET MVC是一个强大的Web应用程序开发框架,由微软公司推出,用于构建可维护、高性能和具有优秀用户体验的Web应用。在本“asp.net mvc博客Blog源码”项目中,我们可以深入学习和理解ASP.NET MVC的核心概念和技术...
在IT行业中,MVC(Model-View-Controller)是一种广泛应用于软件开发的架构模式,尤其在Web应用领域中。这个模式将应用程序分为三个主要部分,每个部分都有明确的责任,从而提高了代码的可维护性和可扩展性。本项目...
**ASP.NET MVC 框架详解** ASP.NET MVC(Model-View-Controller)是一种轻量级、基于组件的Web应用程序架构,它由微软开发并应用于.NET Framework中,为开发者提供了构建可测试、灵活且易于维护的Web应用的强大工具...
ASP.NET MVC5 是微软开发的一款用于构建动态网站的框架,它结合了模型-视图-控制器(MVC)设计模式,使开发者能够更高效地构建可维护和测试的Web应用程序。在本入门教程中,我们将重点探讨如何在ASP.NET MVC5中实现...
ASP.NET MVC 是微软开发的一款用于构建动态Web应用程序的框架,它结合了ASP.NET的优势和Model-View-Controller(MVC)设计模式的灵活性。在这个"ASP.NET MVC 项目集合.zip"压缩包中,可能包含了多个ASP.NET MVC项目...
这个jar文件包含Spring MVC框架相关的所有类。 包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。 当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的...