`

MVC

 
阅读更多
MVC是一种复合模式,结合了观察者,策略模式和组合模式。

要点:
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();
}




  • 大小: 115.5 KB
  • 大小: 14.1 KB
分享到:
评论

相关推荐

    ASP.NET MVC项目实例

    ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比...

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    ASP.NET MVC企业实战源代码Chapter12.rar

    本书共分为12章,以符合初学者思维的方式系统地介绍ASP.NET MVC的应用技巧,并结合实际项目详细地介绍如何基于ASP.NET MVC构建企业项目。通过本书的学习,读者可以全面掌握ASP.NET MVC的开发,并从代码中获取软件...

    【免费】ASP.NET MVC5 高级编程[附源码].rar

    ASP.NET MVC5高级编程(第5版.NET开发经典名著)作为Microsoft备受欢迎的MVC技术的最新版本,MVC 5是一个成熟的Web应用程序框架,支持快速的、TDD友好的开发。MVC允许开发人员创建动态的、数据驱动的网站。这样的...

    ASP.NETMVC5网站开发之美【高清PDF】

    第1章 MVC概述 第2章 与数据的对话:Model与ADO.NET 第3章 LINQ:驱动数据的查询功能 第4章 EF 第5章 路由(Routing) 第6章 控制器(Controller) 第7章 异步程序设计 第8章 View:摇曳生姿的美人 第9章 Bootstrap ...

    Pro ASP.NET MVC 5 Platform(Apress,Adam.Freeman,2014)

    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 ...

    JavaWeb基于MVC模式开发的简易购物车系统

    该系统主要采用MVC(JSP+JavaBean+Servlet)模式开发,非常适合初学者了解并掌握MVC开发模式,具有如下主要功能: 1.用户登录,注册(用户注册后才能登录) 2.显示所有书籍基本信息(编号,书名,价格等) 3.添加...

    基于ASP.NET MVC项目源码完整下载(含Aspose.Cells、Aspose.Words、NPOI、MvcPaper及在线预览Word、Excel等文档

    基于ASP.NET MVC框架的学习项目,包含MVC的框架的设计思路,通俗易懂学习MVC框架,项目中包含NPOI控件的使用方法(优点:导出几万条数据几秒即可下载下来)以及NPOI导出Excel表到数据库,Aspose.Cells的使用(导入、...

    Programming Microsoft ASP.NET MVC, 3rd Edition

    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实战

    《ASP.NET MVC实战》适合于对MVC框架感兴趣的ASP.NET开发人员,其中的许多设计原则和最佳实践则可以适合于各种开发人员。MVC作为一种流行的应用程序开发框架已经存在多年。现在,Microsoft公司也加入了这个社区,ASP...

    MVC国际化,MVC多语言,.NET多语言

    MVC国际化,MVC多语言,.NET多语言 中英文切换

    Aspnet Mvc教程 11.重定向、Redirect

    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教程 5. 基本工作流程

    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设计模式的扩展 四、MVC的优点 五、MVC的不足

    mvc3,4,5区别于联系

    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

    Asp.net MVC快速开发框架源码 mvc+Bootstrap 框架使用场景:OA、ERP、BPM、CRM、WMS、TMS、MIS等业务管理系统及后台系统

    vue项目demo(asp.net mvc5+vue2.5)

    本项目是asp.net mvc5+vue2.5的项目,花了很长时间做的。 实现的功能如下: 1.不仅有vue的基本功能,而且设计到vue的组件功能。 2.实现了增删改查的功能,而且是一对多的。 3.后台使用了EF进行操作数据库,EF使用的...

    mvc框架性比较

    对目前主力mvc框架进行性能比价,包括struts,spring mvc等

    MVC 微软范例源码

    MVC微软范例源码,MVC music项目源码

Global site tag (gtag.js) - Google Analytics