- 浏览: 724028 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1043)
- 数据结构 (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 (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
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 774桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 803访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 644解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 598享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 418中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 546职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 553合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 402组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 537备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 574委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 536建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 584外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 364迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 465原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 306里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 362依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 522开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 529单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
代理模式(Proxy)
2011-07-19 15:47 888代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ... -
状态模式(State)
2011-07-13 17:33 841状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像 ...
相关推荐
ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比...
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...
本书共分为12章,以符合初学者思维的方式系统地介绍ASP.NET MVC的应用技巧,并结合实际项目详细地介绍如何基于ASP.NET MVC构建企业项目。通过本书的学习,读者可以全面掌握ASP.NET MVC的开发,并从代码中获取软件...
ASP.NET MVC5高级编程(第5版.NET开发经典名著)作为Microsoft备受欢迎的MVC技术的最新版本,MVC 5是一个成熟的Web应用程序框架,支持快速的、TDD友好的开发。MVC允许开发人员创建动态的、数据驱动的网站。这样的...
第1章 MVC概述 第2章 与数据的对话:Model与ADO.NET 第3章 LINQ:驱动数据的查询功能 第4章 EF 第5章 路由(Routing) 第6章 控制器(Controller) 第7章 异步程序设计 第8章 View:摇曳生姿的美人 第9章 Bootstrap ...
The power of ASP.NET MVC 5 stems from the underlying ASP.NET platform. To make your ASP.NET MVC applications the best they can be, you need to fully understand the platform features and know how they ...
该系统主要采用MVC(JSP+JavaBean+Servlet)模式开发,非常适合初学者了解并掌握MVC开发模式,具有如下主要功能: 1.用户登录,注册(用户注册后才能登录) 2.显示所有书籍基本信息(编号,书名,价格等) 3.添加...
基于ASP.NET MVC框架的学习项目,包含MVC的框架的设计思路,通俗易懂学习MVC框架,项目中包含NPOI控件的使用方法(优点:导出几万条数据几秒即可下载下来)以及NPOI导出Excel表到数据库,Aspose.Cells的使用(导入、...
Develop next-generation web applications with ASP.NET MVC Go deep into the architecture and features of ASP.NET MVC 5, and learn how to build web applications that work well on both the desktop and ...
《ASP.NET MVC实战》适合于对MVC框架感兴趣的ASP.NET开发人员,其中的许多设计原则和最佳实践则可以适合于各种开发人员。MVC作为一种流行的应用程序开发框架已经存在多年。现在,Microsoft公司也加入了这个社区,ASP...
MVC国际化,MVC多语言,.NET多语言 中英文切换
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
mvc入门——经典MVC登录实例
主要包括MVC的设计思想、实现和原理,以及和其他人的理解。 一、MVC设计思想 二、MVC设计模式的实现 三、MVC设计模式的扩展 四、MVC的优点 五、MVC的不足
mvc3.mvc4/mvc5区别于联系,1.use new features like 'Tilde slash'. 2.Syntex:Razor Syntax and 'Tilde Slash'i.e 3.Chart,WebGrid,Crypto,WebImage,WebMail Controls 4.ViewBag is not onle available but it is ...
Asp.net MVC快速开发框架源码 mvc+Bootstrap 框架使用场景:OA、ERP、BPM、CRM、WMS、TMS、MIS等业务管理系统及后台系统
本项目是asp.net mvc5+vue2.5的项目,花了很长时间做的。 实现的功能如下: 1.不仅有vue的基本功能,而且设计到vue的组件功能。 2.实现了增删改查的功能,而且是一对多的。 3.后台使用了EF进行操作数据库,EF使用的...
对目前主力mvc框架进行性能比价,包括struts,spring mvc等
MVC微软范例源码,MVC music项目源码