策略模式


#include 
#include 

class Strategy {
public:
    virtual void show() = 0;
};

class Context {
public:
    void setStrategy(std::shared_ptr s) { s_ = s; }
    void show() {
        std::cout << "In Context show()." << std::endl;
        if(s_) { s_->show(); }
    }
private:
    std::shared_ptr s_ = nullptr;
};

class ConcreteStrategy1 : public Strategy {
public:
    void show() override { std::cout << "In ConcreteStrategy1 show()." << std::endl; }
};

class ConcreteStrategy2 : public Strategy {
public:
    void show() override { std::cout << "In ConcreteStrategy2 show()." << std::endl; }
};

int main(int argc, char *argv[]) {
    std::shared_ptr s1 = std::make_shared();
    std::shared_ptr s2 = std::make_shared();
    std::unique_ptr c = std::make_unique();
    c->show();
    c->setStrategy(s1);
    c->show();
    c->setStrategy(s2);
    c->show();
    return 1;
}