设计模式之单例模式和观察者模式 & MVC框架

一、单例模式

类图关系: image.png

#include <iostream> 
using namespace std
class Singleton
{
 
public:
    static Singleton* getInstance() 
    
{
        if(_ins == NULL)
            _ins = new Singleton; 
        return _ins;
    }
    static void releaseInstance() 
    
{
        if(_ins != NULL
        {
            delete _ins; 
            _ins = NULL;
        } 
    }
    void run() 
    
{
        cout<<"test singleton"<<endl
    }
private:
    Singleton(){} 
    ~Singleton(){}
    Singleton(const Singleton &){} 
    Singleton & operator=(const Singleton&){} 
    static Singleton * _ins;
};
Singleton * Singleton::_ins = NULL
int main()
{
    Singleton::getInstance()->run(); // 常用
    Singleton * ps = Singleton::getInstance(); 
    ps->run();
    Singleton::releaseInstance(); 
    return 0;
}

二、观察者模式(订阅模式)

类图关系: image.png

代码:实现多个时钟显示是去,如果设置了一个北京时间,其他的时钟图形也要更新。

#include <iostream> 
#include <list>
#include <algorithm> 
using namespace std

class Observer
{
 
public:
    virtual void update(int hour, int min ,int sec) 0
};

class Subject 
{

public:
    virtual void registerObserver(Observer * ob) 0;
    virtual void removeObserver(Observer *ob) 0;
    virtual void notify() 0
protected:
    list<Observer*> observerList; 
};

class PekingTimeSubject:public Subject 
{
public:
    void setTimer(int hour, int min, int sec) 
    
{
        _hour = hour; 
        _min = min;
        _sec = sec; 
        notify();
    }
    void registerObserver(Observer * ob) 
    
{
        observerList.push_back(ob); 
    }
    void removeObserver(Observer *ob) 
    
{
        //observerList.erase(find(observerList.begin(),observerList.end(),ob)); 
        observerList.remove(ob);
    }
    void notify() // 此函数必须在子类中实现,因为,要接触数据。 
    
{
        list<Observer*>::iterator itr = observerList.begin(); 
        for(; itr != observerList.end(); itr++)
        {
            (*itr)->update(_hour,_min,_sec); 
        }
    } 
private:
    int _hour;
    int _min;
    int _sec; 
};

class AmericaTimerObserver:public Observer 
{
public:
    void update(int hour, int min ,int sec) 
    
{
        _hour = hour; 
        _min = min; 
        _sec = sec;
        dis(); 
    }
    void dis() 
    
{
        cout<<"America Time is update"<<endl;
        cout<<"H:"<<_hour<<" M:"<<_min<<" S:"<<_sec<<endl
    }
private:
    int _hour;
    int _min;
    int _sec; 
};

class JapanTimerObserver:public Observer 
{
public:
    void update(int hour, int min ,int sec) 
    
{
        _hour = hour; 
        _min = min; 
        _sec = sec;
        dis(); 
    }
    void dis() 
    
{
        cout<<"Japan Time is update"<<endl;
        cout<<"H:"<<_hour<<" M:"<<_min<<" S:"<<_sec<<endl;
    } 
private:
    int _hour;
    int _min;
    int _sec;
};

int main() 
{
    PekingTimeSubject *bj = new PekingTimeSubject; 
    JapanTimerObserver *jp = new JapanTimerObserver; 
    AmericaTimerObserver *am = new AmericaTimerObserver; 
    bj->registerObserver(jp);
    bj->registerObserver(am); 
    bj->setTimer(10,20,30); 
    bj->removeObserver(jp); 
    bj->setTimer(1,2,3); 
    return 0;
}

三、MVC框架

MVC全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller) 的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

程序的模式:

  • Model(模型)表示应用程序核心(比如数据库记录列表)。
  • View(视图)显示数据(数据库记录)。
  • Controller(控制器)处理输入(写入数据库记录)。

V比较简单

M可以理解为代码中的数据结构等的定义

V理解为和界面相关的操作

C不好分辨,一般除了M和V都当做C,一般是和业务逻辑等相关的,分为C

MVC的示意图:

posted @ 2022-04-12 00:05  mengchao  阅读(103)  评论(0编辑  收藏  举报