首页 > 其他分享 >对mvc模式的理解

对mvc模式的理解

时间:2023-02-19 17:23:08浏览次数:29  
标签:void 理解 stop 模式 start mvc 视图 mModel view

Model-View-Controller

MVC模式是个威力强大的复合模式,是由数个设计模式结合起来的模式;

我们先看一下一个mp3播放器的设计,来由浅至深地了解这个设计模式的精髓所在:

 

从最直观的地方入手,我们不要先入为主的去使用mvc这个模式,而是尝试用自己最为直观的方式去设计这个应用,那么事情会变成这样:

首先从交互的角度,我们先提出需求:

  • 用户界面上需要显示当前歌曲名
  • 用户可以通过按键直接选择上一首,下一首;
  • 用户可以通过menu按键,显示当前MP3中的所有歌曲列表,然后上下按键选择一首歌曲,并通过ok键播放

好的,其实上述需求,明确了一点,这些需求需要有视图,或者至少需要有View去告诉用户各种状态;ok,那有没有不需要view的需求呢?有,比如,按下风扇能转动,这种需求很简单就不需要view, 但是,这不是重点,重点在于,用户需要对机器当前的状态有个直观的感知,或者反馈,比如风扇上如果我们想要做高端,然后会加个面板,告诉用户当前的风速,室内温度等,最终还是免不了会有view的存在,view的形式可以是多样的,可以是网页的形式,可以是led的形式,可以是数码管的形式,这些只是展示方式的不同,真正的核心在于这些view展示的数据本身,这些才是用户真正care的地方;比如我的歌单里有没有某首歌(模型),比如我播放下一曲的时候,是否能正常切过去(控制器);简单总结就是:用户操作,会作用于控制器,控制器判断用户需要切歌,需要更改当前播放的歌曲索引,然后通知player 播放新的歌曲;模型的改变,会相应地引起视图的改变 ;

那么这里使用了哪些设计模式呢?

 

 

这里复习一下观察者模式和策略模式:

 

 

观察者模式的好处在于,模型对视图没有依赖,其含义是模型部分无需变更,便可以支持视图的替换,或多个视图去展示同一个模型;

 

纸上得来终觉浅,我们还是从代码的角度来看一下整个事情的细节吧:

class Mp3Model {
public:
    int     getSongIdxByString(string song);
    string  getSoneNameByIdx(int idx);
    string  getCurrentSong()

    void setCurrentSong(string song) {
         // hw hal to set song file
         ...
         // then notify observers
         notifyObserver(); // 通知观察者状态改变
    }
    // 实际的start/stop
    void start();
    void stop();
    void registerObsever(Observer* observer) // model提供注册观察者方法
    {
         mObserver = observer;
    }
private:
    void notifyObserver() {
        mObserver->onNotify();
    }
    Observer* mObserver;
};

class Mp3Controller {
public:
    Mp3Controller(Mp3Model* model) { mModel = model; }
    void playNext() { 
       mModel->setCurrentSong(mModel->getSongIdxByString(mModel->getCurrentSong()) + 1); 
    }
    void playPrevious() { 
       mModel->setCurrentSong(mModel->getSongIdxByString(mModel->getCurrentSong()) - 1); 
    }
    void start() { mModel->start();}
    void stop() { mModel->stop(); }
private:
    Mp3Model* mModel;
};

class Mp3View : public Observer {
public:
    Mp3View() {
       mModel = new Mp3Model;
       mModel->registerObserver((Oberver*)this);
       mController = new Mp3Controller(mModel);
    }
    void on_click_next() { mController->playNext(); }
    void on_click_previous() { mController->playPrevious(); }
    void on_click_start() { mContrlloer->start(); }
    void on_click_stop() { mController->stop(); }
    void onNotify() { //实现model变化时的回调,如改变控件状态等 } 
    void run();
    bool live();
private:
    Mp3Controller* mController;
    Mp3Model* mModel;
};

int main() {
  // 创建view需要controller, mode , 创建controller需要model
  Mp3View* mp3_view = new Mp3View;
  mp3_view.run();
  while(mp3_view.live()) {
     sleep(1);
  }
  return 0;
}

 

标签:void,理解,stop,模式,start,mvc,视图,mModel,view
From: https://www.cnblogs.com/Arnold-Zhang/p/17135114.html

相关文章

  • Module理解及使用
    ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显......
  • ZMQ请求应答模式之无中间件的可靠性--自由者模式
    一、引言  我们讲了那么多关于中间件的示例,好像有些违背“ZMQ是无中间件”的说法。但要知道在现实生活中,中间件一直是让人又爱又恨的东西。实践中的很多消息架构能都在使......
  • 设计模式-简单工厂
    api.h#pragmaonce#include<string>#include<iostream>classAPI{public: virtualvoidrun(std::string)=0;protected: API(){};};classBAPI:publ......
  • 设计模式-原型模式
    原型模式(PrototypePattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式应用实例描述如下:未使用原型模式#inc......
  • 设计模式-建造者模式
    业务场景未使用建造者模式实现#include<iostream>#include<string>#include<vector>#include<sstream>usingnamespacestd;template<classT>stringConvertTo......
  • 深入理解Java字符串常量池
    “先从这道面试题开始吧!”Strings=newString("二哥");“这行代码创建了几个对象?”“不就一个吗?”三妹不假思索地回答。“不,两个!”我直接否定了三妹的答案,“使用ne......
  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • 软件测试|测试开发之路--UI 自动化常用设计模式
    接上一次的帖子,今天讲一下我再UI自动化中常用的设计模式。由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了。就是讲我也讲不出什......
  • php 运用设计模式:观察者模式,设计电商平台支付成功程序|Github仓库
    前(fei)言(hua)在支付程序中,大型项目的维护,如果没有运用到设计模式,面向过程的编程,order程序会日益增加,程序看上去杂乱无章,今天写了一个小demo,之前没有运用过观察者模式的小伙......
  • react中Hooks的理解和用法
    一、Hooks是什么?Hook 是React16.8的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性至于为什么引入hook,官方给出的动机是解决......