设计模式

创建型设计模式:单例、原型、工厂方法、抽象工厂、建造者等5种。
结构型设计模式:代理、适配器、桥接、装饰、享元、组合、外观等7种。
行为型设计模式:模板方法、策略命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器、命令等11种。
 
简单工厂类:
抽象产品(纯虚函数)+n个具体产品(重载纯虚+抽象指针指针具体产品)+具体工厂(根据产品类型创建类)
#include <iostream>
#include <string>
class BMW
{
public:
    virtual void GetCar() = 0;
};
 
class BMW320 : public BMW
{
public:
    BMW320(){};
    void GetCar()
    {
        std::cout << "BMW320" << std::endl;
    }
};
 
class BMW520 : public BMW
{
public:
    BMW520(){};
    void GetCar()
    {
        std::cout << "BMW520" << std::endl;
    }
};
 
//工厂类
class SimpleFactory
{
public:
    SimpleFactory(){};
    BMW* CreateCar(std::string name)
    {
        if (name == "BMW320")
        {
            return new BMW320();
        }
        else if (name == "BMW520")
        {
            return new BMW520();
        }
        else
        {
            return NULL;
        }
    }
};
int main(int argc, char const* argv[])
{
    SimpleFactory sf;
    BMW*          car1 = sf.CreateCar("BMW320");
    BMW*          car2 = sf.CreateCar("BMW520");
    car1->GetCar();
    car2->GetCar();
    return 0;
}
 
工厂类:抽象产品(纯虚函数)+n个具体产品(重载纯虚+抽象指针指针具体产品)+抽象工厂(纯虚函数)+n个具体工厂(重载纯虚+抽象指针指针具体工厂)
#include <iostream>
#include <string>
class BMW
{
public:
    virtual void GetCar() = 0;
};
 
class BMW320 : public BMW
{
public:
    BMW320(){};
    void GetCar()
    {
        std::cout << "BMW320" << std::endl;
    }
};
 
class BMW520 : public BMW
{
public:
    BMW520(){};
    void GetCar()
    {
        std::cout << "BMW520" << std::endl;
    }
};
 
//抽象工厂类
class Factory
{
public:
    virtual BMW* CreateCar(std::string name) = 0;
};
//具体工厂1
class BMW320Factory : public Factory
{
public:
    BMW320Factory(){};
    BMW* CreateCar(std::string name)
    {
        return new BMW320();
    }
};
//具体工厂2
class BMW520Factory : public Factory
{
public:
    BMW520Factory(){};
    BMW* CreateCar(std::string name)
    {
        return new BMW520();
    }
};
int main(int argc, char const* argv[])
{
    Factory* sf1 = new BMW320Factory();
    Factory* sf2 = new BMW520Factory();
 
    BMW* car1 = sf1->CreateCar("BMW320");
    BMW* car2 = sf2->CreateCar("BMW520");
    car1->GetCar();
    car2->GetCar();
    return 0;
}
 
构造者类型:
产品(Product):表示要构建的复杂对象,包含多个组成部件。
抽象建造者(Abstract Builder):定义创建产品各个部件的接口,并声明一个方法返回最终的完整产品。
具体建造者(Concrete Builders):实现抽象建造者的接口,提供创建产品各个部件的详细实现,并在最后返回一个完整的具体产品实例。
导演者(Director):负责调用具体建造者的相关方法来一步步构建产品,它不涉及具体产品的部件创建细节,只负责按特定顺序安排建造过程
 
direcotr(具体build的ptr+组织构造产品过程)-》抽象build(定义构造步骤,但是不包含构造顺序)/具体build(具体实现+产品ptr)->抽象产品(产品需要的内容接口)/具体build(内容接口的实现)
 
#include <iostream>
#include <memory>
#include <string>
//抽象产品类
class Computer
{
public:
    using ptr = std::shared_ptr<Computer>;
    Computer() {}
    void setBoard(const std::string& board)
    {
        _board = board;
    }
    void setDisplay(const std::string& display)
    {
        _display = display;
    }
    virtual void setOs() = 0;
    std::string  toString()
    {
        std::string computer = "Computer:{\n";
        computer += "\tboard=" + _board + ",\n";
        computer += "\tdisplay=" + _display + ",\n";
        computer += "\tOs=" + _os + ",\n";
        computer += "}\n";
        return computer;
    }
 
protected:
    std::string _board;
    std::string _display;
    std::string _os;
};
//具体产品类
class MacBook : public Computer
{
public:
    using ptr = std::shared_ptr<MacBook>;
    MacBook() {}
    virtual void setOs()
    {
        _os = "Max OS x12";
    }
};
//抽象构建者
class Builder
{
public:
    using ptr                                                      = std::shared_ptr<Builder>;
    virtual void          buildBoard(const std::string& board)     = 0;
    virtual void          buildDisplay(const std::string& display) = 0;
    virtual void          buildOs()                                = 0;
    virtual Computer::ptr build()                                  = 0;    //创建实例返回的指针的虚函数
};
//具体产品构造者
class MacBookBuilder : public Builder
{
public:
    using ptr = std::shared_ptr<MacBookBuilder>;
    MacBookBuilder() : _computer(new MacBook()) {}
    virtual void buildBoard(const std::string& board)
    {
        _computer->setBoard(board);
    }
    virtual void buildDisplay(const std::string& display)
    {
        _computer->setDisplay(display);
    }
    virtual void buildOs()
    {
        _computer->setOs();
    }
    virtual Computer::ptr build()
    {
        return _computer;
    }
 
private:
    Computer::ptr _computer;
};
//提供给调用者
class Director
{
public:
    Director(Builder* builder) : _builder(builder){};
    void construct(const std::string& board, const std::string& display)
    {
        _builder->buildBoard(board);
        _builder->buildDisplay(display);
        _builder->buildOs();
    }
 
private:
    Builder::ptr _builder;
};
 
代理模式:
当客户端对象需要访问远程主机中的对象时可以使用远程代理。
当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代
使用:
//抽象主题
public interface Landlord {
    void rentHome();
}
//实际主题
public class Coder implements Landlord {
    @Override
    public void rentHome() {
        System.out.println("租个70平房子");
    }
}
//代理
public class Ziru implements Landlord {
    @Override
    public void rentHome() {
        Coder coder=new Coder();
        coder.rentHome();
    }
}
 
装饰器模式:
#include <iostream>
//抽象类
class Hero
{
public:
    virtual void show_skill() = 0;
};
//具体类:基本功能
class runHero : public Hero
{
    void run_skill()
    {
        std::cout << "只能跑的超人" << std::endl;
    }
    virtual void show_skill()
    {
        run_skill();
    }
};
class flyHero : public Hero
{
private:
    Hero* m_hero;
public:
    flyHero(Hero* hero)
    {
        this->m_hero = hero;
    }
    void fly_skill()
    {
        std::cout << "拥有飞行技能" << std::endl;
    }
    virtual void show_skill()
    {
        this->m_hero->show_skill();
        fly_skill();
    }
};
 
class laserHero : public Hero
{
private:
    Hero* m_hero;
 
public:
    laserHero(Hero* hero)
    {
        this->m_hero = hero;
    }
    void laser_skill()
    {
        std::cout << "拥有激光眼技能" << std::endl;
    }
    virtual void show_skill()
    {
        this->m_hero->show_skill();
        laser_skill();
    }
};
int main(int argc, char const* argv[])
{
    Hero* myHero1 = NULL;
    std::cout << "第一个英雄" << std::endl;
    std::cout << "初始形态" << std::endl;
    myHero1 = new runHero();
    myHero1->show_skill();
    std::cout << "第一次升级" << std::endl;
    Hero* myHero2 = new flyHero(myHero1);
    myHero2->show_skill();
    std::cout << "第二次升级" << std::endl;
    Hero* myHero3 = new laserHero(myHero2);
    myHero3->show_skill();
    return 0;
}
 
适配器模式:
#include <iostream>
#include <memory>
//客户需要的TTL接口
class TTL
{
public:
    virtual void get_ttl() = 0;
};
//Adaptee只有rs232接口
class RS232
{
public:
    void get_rs232()
    {
        std::cout << "RS232接口" << std::endl;
    }
};
//Adapter适配器
class adapter : public TTL
{
private:
    RS232* m_232;
public:
    adapter(RS232* m_232)
    {
        this->m_232 = m_232;
    }
    void adapter232_to_ttl()
    {
        std::cout << "适配器:将RS232转换为TTL" << std::endl;
    }
    virtual void get_ttl()
    {
        this->m_232->get_rs232();
        adapter232_to_ttl();
        std::cout << "ttl接口" << std::endl;
    }
};
int main(int argc, char const* argv[])
{
    std::shared_ptr<RS232> my232 = nullptr;
    my232                        = std::make_shared<RS232>();
 
    std::shared_ptr<adapter> ad = nullptr;
    ad                          = std::make_shared<adapter>();
    my232->get_rs232();
    std::cout << "========" << std::endl;
    ad->get_ttl();
    return 0;
}
 
模板方法模式:
父类:定义步骤和确定的事情,子类具体实现