设计模式之单例模式和观察者模式 & MVC框架
一、单例模式
#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;
}
二、观察者模式(订阅模式)
代码:实现多个时钟显示是去,如果设置了一个北京时间,其他的时钟图形也要更新。
#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的示意图:

作者: mengchao
出处:https://www.cnblogs.com/meng-chao/p/16133189.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!