`

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

    MVC简单例子C#

    **MVC(Model-View-Controller)模式是软件开发中的一种设计模式,尤其在Web应用开发中被广泛应用。C#是Microsoft开发的一种面向对象的编程语言,它与.NET框架紧密结合,支持构建各种类型的应用,包括MVC应用。在这...

    ASP.NET MVC5

    ASP.NET MVC5是一个基于微软.NET Framework的开源web应用程序框架,专为构建动态、数据驱动的Web应用程序而设计。它结合了Model-View-Controller(MVC)设计模式、ASP.NET的功能性和HTML5的能力,提供了更高效、灵活...

    经典MVC登录实例代码

    **MVC模式与Servlet、JSP的协同工作** 在Web应用开发中,Model-View-Controller(MVC)模式是一种广泛采用的设计模式,它将应用程序的业务逻辑、数据和用户界面分离,使得开发和维护更加方便。在这个"经典MVC登录...

    C# MVC 经典框架

    C# MVC(Model-View-Controller)经典框架是基于微软.NET平台的一种强大的Web应用程序开发模式。这个框架结合了MVC设计模式的灵活性和C#语言的强类型特性,为开发者提供了构建可维护、高性能和高度分层的Web应用的...

    ASP.NET MVC4 教程(完整版).pdf

    *** MVC 4是一个用于构建可扩展、基于标准的Web应用程序的框架,它使用了众所周知的设计模式,并且充分利用了***和.NET框架的强大功能。*** MVC框架允许开发者使用模型-视图-控制器(Model-View-Controller, MVC)...

    MVC2.0入门必读教程程序源码

    MVC2.0入门必读教程程序源码 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了。可以说自动推出以来,一直广受关注。在经历了漫长的Preview之后,前几天终于推出了其beta版。并且在官方文档中,微软...

    PureMVC 中文版

    标题 "PureMVC 中文版" 指的是 PureMVC 框架的一个中文版本,这是一款广泛应用的开源框架,特别设计用于构建富互联网应用程序(RIA),尤其是基于Adobe Flex和ActionScript 3的项目。PureMVC 提供了一种模块化、结构...

    ASP.NET MVC项目源代码设计资料

    ASP.NET MVC是一个强大的框架,用于构建可维护性和灵活性极高的Web应用程序。它是Microsoft为开发者提供的一种基于模型-视图-控制器(MVC)设计模式的工具,使得开发人员能够更清晰地分离业务逻辑、数据处理和用户...

    Pro ASP.NET MVC 5 (精通ASP.NET MVC5框架) 中文+英文+配套源代码

    **ASP.NET MVC 5 框架详解** ASP.NET MVC 5 是 Microsoft 推出的一款用于构建可伸缩、高性能的 Web 应用程序的框架,它基于模型-视图-控制器(MVC)设计模式,结合了ASP.NET Web Forms 和 ASP.NET Web API 的优势,...

    ASP.Net MVC4 安装文件

    ASP.NET MVC4(Model-View-Controller)是微软推出的一款用于构建动态网站的开源框架,它基于ASP.NET平台,提供了一种分离关注点、结构清晰的开发模式。在这个"ASP.NET MVC4 安装文件"中,包含了适用于Visual Studio...

    asp.net MVC4 CMS

    ASP.NET MVC4 CMS 是一个基于微软的ASP.NET MVC4框架构建的内容管理系统,它提供了一种高效、可扩展的方式来管理和展示网站内容。MVC(Model-View-Controller)设计模式是其核心,它将应用程序分为三个主要组件:...

    asp.net mvc博客Blog源码

    ASP.NET MVC是一个强大的Web应用程序开发框架,由微软公司推出,用于构建可维护、高性能和具有优秀用户体验的Web应用。在本“asp.net mvc博客Blog源码”项目中,我们可以深入学习和理解ASP.NET MVC的核心概念和技术...

    C++实现简单的MVC框架

    在IT行业中,MVC(Model-View-Controller)是一种广泛应用于软件开发的架构模式,尤其在Web应用领域中。这个模式将应用程序分为三个主要部分,每个部分都有明确的责任,从而提高了代码的可维护性和可扩展性。本项目...

    基于ASP.NET MVC项目实例

    **ASP.NET MVC 框架详解** ASP.NET MVC(Model-View-Controller)是一种轻量级、基于组件的Web应用程序架构,它由微软开发并应用于.NET Framework中,为开发者提供了构建可测试、灵活且易于维护的Web应用的强大工具...

    ASP.NET MVC5 入门 之登录验证

    ASP.NET MVC5 是微软开发的一款用于构建动态网站的框架,它结合了模型-视图-控制器(MVC)设计模式,使开发者能够更高效地构建可维护和测试的Web应用程序。在本入门教程中,我们将重点探讨如何在ASP.NET MVC5中实现...

    ASP.NET MVC 项目集合.zip

    ASP.NET MVC 是微软开发的一款用于构建动态Web应用程序的框架,它结合了ASP.NET的优势和Model-View-Controller(MVC)设计模式的灵活性。在这个"ASP.NET MVC 项目集合.zip"压缩包中,可能包含了多个ASP.NET MVC项目...

    spring-webmvc5.3.6 jar包.rar

    这个jar文件包含Spring MVC框架相关的所有类。  包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。  当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的...

Global site tag (gtag.js) - Google Analytics