设计模式汇总

单例模式

工厂模式

模板方法

定义:定义一个操作中的算法的骨架稳定,而将一些步骤延迟变化到子类中去。模板方法使得子类可以不改变一个算法的结构即可重定义(override重写)该算法的某些特定步骤
使用举例:
在C++高性能服务器搭建中,在io调度部分,使用了模板方法,比如先实现一个调度器,在run函数中,首先实现start创建线程,然后在idle中向列表中添加事件,然后run中将链表的事件一一执行,同时如果该线程有不能处理的事件可以通过tickle通知别的线程处理。

#include <iostream>
using namespace std;
class  Scheduler{
public:
	virtual ~Scheduler(){};
    void run(){
        start();
        idle();
        tickle();
    }
protected:
    virtual void start()=0;
    virtual void idle()=0;
    virtual void tickle()=0;
    
};
class Epoll :public Scheduler{
protected:
    virtual void start() override{
        cout<<"epoll start"<<endl;
    }
    virtual void idle() override{
        cout<<"epoll idle"<<endl;
    }
    virtual void tickle() override{
        cout<<"epoll tickle"<<endl;
    }
};

class Select :public Scheduler{
protected:
    virtual void start() override{
        cout<<"select start"<<endl;
    }
    virtual void idle() override{
        cout<<"select idle"<<endl;
    }
    virtual void tickle() override{
        cout<<"select tickle"<<endl;
    }
};
int main()
{
    Scheduler* ep=new Epoll;
    Scheduler* se=new Select;
    ep->run();
    se->run();
    delete ep;
    delete se;
}

策略模式

定义:定义一系列算法,把他们一个个的封装起来,并且使他们可以互相替换。即通过不同的方法达到同样的目的。
策略模式及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便的根据需要在各个算法之间切换。

class Log_Print{
public:
    virtual void Print()=0;
    virtual ~Log_Print(){}
};
class Std_Print : public Log_Print{
public:
    virtual void Print() override{
        cout<<"print to std"<<endl;
    }
};

class File_Print : public Log_Print{
public:
    virtual void Print() override{
        cout<<"print to file"<<endl;
    }
};

class Log_out{
public:
    Log_out(Log_Print *p){
        m_print=p;
    }
    void Logout(){
        m_print->Print();
    }
private:
    Log_Print *m_print;
};
void test_Strategy(){
    Log_Print* st=new Std_Print;
    Log_Print* fi=new File_Print;
    Log_out *st_log=new Log_out(st);
    Log_out *fi_log=new Log_out(fi);
    st_log->Logout();
    fi_log->Logout();
    delete st;
    delete fi;
    delete st_log;
    delete fi_log;
}
int main()
{
    test_Strategy();
}

观察者模式

定义:定义对象间的一种一对多(变化)的依赖关系,以便当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新。

class Observer { // 抽象观察者,为所有具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫更新接口
public:
    virtual void Update() = 0;
};

class Subject { // 主题或抽象通知者,一般用一个抽象类或者接口实现
private:
    list<Observer* > observers;
public:
    void Attach(Observer* observer) { observers.push_back(observer); } // 增加观察者
    void Detach(Observer* observer) { observers.remove(observer); } // 移除观察者
    void Notify() { // 通知
        for (auto observer = observers.begin(); observer != observers.end(); observer++) {
            (*observer)->Update();
        }
    }
};

class ConcreteSubject : public Subject { // 具体主题或具体通知者,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发送通知
private:
    string subjectState;
public:
    string GetState() { return subjectState; }
    void SetState(string state) { subjectState = state; }
};

class ConcreteObserver : public Observer { // 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调
private:
    string name;
    ConcreteSubject* subject;
    string observerState;
public:
    ConcreteObserver(ConcreteSubject* s, string n) {
        subject = s;
        name = n;
    }
    void Update() {
        observerState = subject->GetState();
        cout << "observer: " << name << ", its new state is: " << observerState << endl;
    }
    string GetState() { return observerState; }
    void SetState(string state) { observerState = state; }
};
void test_Observer(){
    ConcreteSubject* s = new ConcreteSubject();
       s->SetState("ABC");
       ConcreteObserver* ox = new ConcreteObserver(s, "X");
       ConcreteObserver* oy = new ConcreteObserver(s, "Y");
       ConcreteObserver* oz = new ConcreteObserver(s, "Z");
       s->Attach(ox);
       s->Attach(oy);
       s->Attach(oz);
       s->Notify();
       // observer: X, its new state is: ABC
       // observer: Y, its new state is: ABC
       // observer: Z, its new state is: ABC
       s->SetState("XYZ");
       s->Notify();
       // observer: X, its new state is: XYZ
       // observer: Y, its new state is: XYZ
       // observer: Z, its new state is: XYZ
       delete ox;
       delete oy;
       delete oz;
       delete s;
}

装饰者模式

定义:动态组合的给一个对象增加一些额外的职责。就增加功能而言,装饰者模式比生成子类(继承)而言,更灵活(消除重复代码与子类个数)
应用场景:stream有多种类型,有文件流,网络流,且各自有各自的read、write、seek,此时需要对这些流进行加密、buffer等操作,常规思路是再对各个流写不同的加密文件流、加密网络流、缓存文件流、缓存网络流等操作的类,这样会产生大量重复的代码和写大量的类。但其实对于加密或者缓存,只有其本身的read,write,seek等是不同的,剩下的加密、缓存操作完全一致,所以就写一个装饰者模式,装饰器中有一个sream(可以在运行时变成各种stream),然后统一进行加密、缓存等操作。

class Stream{
public:
    virtual ~Stream(){}
    virtual void read()=0;
    virtual void write()=0;
    virtual void seek()=0;
};

class FileStream:public Stream{
public:
    void read(){
        cout<<"filestream read"<<endl;
    }
    void write(){
        cout<<"filestream write"<<endl;
    }
    void seek(){
        cout<<"filestream seek"<<endl;
    }
};

class NetworkStream:public Stream{
public:
    void read(){
        cout<<"NetworkStream read"<<endl;
    }
    void write(){
        cout<<"NetworkStream write"<<endl;
    }
    void seek(){
        cout<<"NetworkStream seek"<<endl;
    }
};
class DecoratorStream:public Stream{
protected:
    Stream *m_stream;
public:
    DecoratorStream(Stream *stream):m_stream(stream){}
};

class CryptoStream:public DecoratorStream{
public:
    CryptoStream(Stream *stream):DecoratorStream(stream){}
    virtual void read(){
        m_stream->read();
        cout<<"CryptoStream other read"<<endl;
    }
    virtual void write(){
        m_stream->write();
        cout<<"CryptoStream other write"<<endl;
    }
    virtual void seek(){
        m_stream->seek();
        cout<<"CryptoStream other seek"<<endl;
    }
};

class BuffertoStream:public DecoratorStream{
public:
    BuffertoStream(Stream *stream):DecoratorStream(stream){}
    virtual void read(){
        m_stream->read();
        cout<<"BuffertoStream other read"<<endl;
    }
    virtual void write(){
        m_stream->write();
        cout<<"BuffertoStream other write"<<endl;
    }
    virtual void seek(){
        m_stream->seek();
        cout<<"BuffertoStream other seek"<<endl;
    }
};
void test_decorator(){
    Stream *fi=new FileStream;
    DecoratorStream* cd=new CryptoStream(fi);
    DecoratorStream* bd=new BuffertoStream(fi);
    cd->read();
    bd->seek();
}

桥接模式

定义:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
应用场景:

//颜色抽象类
class Color
{
public:
    virtual string GetColor()=0;//获取颜色,用于验证
};

//颜色实现类
class Red:public Color
{
public:
    virtual string GetColor()//获取颜色,用于验证
    {
        return "Red";
    }
};

class Blue:public Color
{
public:
    virtual string GetColor()//获取颜色,用于验证
    {
        return "Blue";
    }
};

class Green:public Color
{
public:
    virtual string GetColor()//获取颜色,用于验证
    {
        return "Green";
    }
};

//形状抽象类
class Shape
{
public:
    Shape(Color* pColor):m_pColor(pColor){}
    virtual void Show()=0;//展示接口,验证实现类中颜色与形状
protected:
    Color* m_pColor;//将图形的颜色抽象,与形状类桥接
};

//形状实现类
class Circle:public Shape
{
public:
    Circle(Color* pColor):Shape(pColor){}//构造圆形时指定颜色
    void Show()//重写展示接口,用于验证
    {
        cout << m_pColor->GetColor() << "Circle" << endl;
    }
};

class Rectangle:public Shape
{
public:
    Rectangle(Color* pColor):Shape(pColor){}//构造矩形时指定颜色
    void Show()//重写展示接口,用于验证
    {
        cout << m_pColor->GetColor() << "Rectangle" << endl;
    }
};

class Triangle:public Shape
{
public:
    Triangle(Color* pColor):Shape(pColor){}//构造三角形时指定颜色
    void Show()//重写展示接口,用于验证
    {
        cout << m_pColor->GetColor() << "Triangle" << endl;
    }
};
void test_bridge(){
    Shape* pBlueCircle = new Circle(new Blue());
    pBlueCircle->Show();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值