`

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框架性比较

    **Java MVC 框架性能比较** 在当前的软件开发领域,MVC(Model-View-Controller)架构模式被广泛应用于构建Web应用。Struts、Spring MVC等是主流的MVC框架,它们提供了丰富的功能,简化了开发流程,但也带来了性能...

    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应用的...

    (1)MVC模式与ASP.NET MVC框架概述

    **MVC模式与ASP.NET MVC框架概述** MVC(Model-View-Controller)模式是一种广泛应用于Web开发的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于实现...

    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 提供了一种模块化、结构...

    MVC网上商城系统

    **MVC网上商城系统** 本项目是一个基于MVC(Model-View-Controller)架构的完整网上商城系统,旨在提供一个用户友好的前端购物体验以及功能完善的后台管理系统。它集成了商品展示、购物车、订单处理、用户管理等...

    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应用领域中。这个模式将应用程序分为三个主要部分,每个部分都有明确的责任,从而提高了代码的可维护性和可扩展性。本项目...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

Global site tag (gtag.js) - Google Analytics