- 浏览: 761522 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 813桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 830访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 673解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 632享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 441中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 582职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 585合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 430组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 558备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 592委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 561建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 623外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 403迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 508原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 333里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 390依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 557开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 554单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
代理模式(Proxy)
2011-07-19 15:47 921代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ... -
状态模式(State)
2011-07-13 17:33 873状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像 ...
相关推荐
ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比...
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...
**Java MVC 框架性能比较** 在当前的软件开发领域,MVC(Model-View-Controller)架构模式被广泛应用于构建Web应用。Struts、Spring MVC等是主流的MVC框架,它们提供了丰富的功能,简化了开发流程,但也带来了性能...
**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模式与ASP.NET MVC框架概述** MVC(Model-View-Controller)模式是一种广泛应用于Web开发的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于实现...
*** 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 提供了一种模块化、结构...
**MVC网上商城系统** 本项目是一个基于MVC(Model-View-Controller)架构的完整网上商城系统,旨在提供一个用户友好的前端购物体验以及功能完善的后台管理系统。它集成了商品展示、购物车、订单处理、用户管理等...
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应用领域中。这个模式将应用程序分为三个主要部分,每个部分都有明确的责任,从而提高了代码的可维护性和可扩展性。本项目...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...