1、备忘录模式

  保存对象的状态,在需要的时候在恢复出来即可!!!


2、具体实现

  (1)、代码实现

#include<iostream>
#include<string>
using namespace std;

class Mem{ //备忘录类
    public:
        Mem(string name, int age){
            m_name = name;
            m_age = age;
        }   
        string getName(){
            return m_name;
        }   
        int getAge(){
            return m_age;
        }   
        void setName(string name){
            m_name = name;
        }   
        void setAge(int age){
            m_age = age;
        }   

    private:
        string m_name;
        int m_age;
};

class Person{
    public:
        Person(string name, int age){
            m_name = name;
            m_age = age;
        }
        string getName(){
            return m_name;
        }
        int getAge(){
            return m_age;
        }
        void setName(string name){
            m_name = name;
        }
        void setAge(int age){
            m_age = age;
        }

        //保存
        Mem *createMem(){
            return new Mem(m_name, m_age);
        }        
        //还原
        void setMem(Mem *mem){
            this->m_age = mem->getAge();
            this->m_name = mem->getName();
        }
        void printT(){
            cout<<"m_name: "<<m_name<<"m_age: "<<m_age<<endl;
        }
    private:
        string m_name;
        int m_age;
};

//增加一个备忘录的管理者!!!
class Manager{
    public:
        Manager(Mem *m){
            this->m = m;
        }
        Mem *getMem(){
            return m;
        }
        void setMem(Mem *m){
            this->m = m;        
        }
    private:
        Mem *m; //持有一个备忘录的引用!!!
};

int main(void){
    /*
    Mem *m = NULL;
    Person *p = new Person("张三",32);
    p->printT();
    //创建Person对象的一个状态
    cout<<"---------------------------"<<endl;
    m = p->createMem();
    p->setAge(42);
    p->printT();

    cout<<"还原旧的状态"<<endl;
    p->setMem(m);
    p->printT();

    delete p;
    */

    Manager *m1;      
    Person *p = new Person("张三",32);
    p->printT();
    //创建Person对象的一个状态
    cout<<"---------------------------"<<endl;
    m1 = new Manager(p->createMem());
    p->setAge(42);
    p->printT();

    cout<<"还原旧的状态"<<endl;
    p->setMem(m1->getMem());
    p->printT();

    delete p;

    return 0;
}

  (2)、结果如下

wKiom1hfMHfBEvFnAABTcXEcczQ703.png-wh_50


3、策略模式

 准备一组算法,并将每一个算法封装起来,使得它们可以互换;


4、具体实现

  (1)、代码如下

#include<iostream>
using namespace std;

//策略模式:准备一组算法,并将每一个算法封装起来,使得它们可以互换;
 
class Strategy{
    public:
        virtual void crypt() = 0;
    private:
};

class AES : public Strategy{
    public:
        virtual void crypt(){
            cout<<"AES加密算法"<<endl;
        }   
    private:

}; 

class DES : public Strategy{
    public:
        virtual void crypt(){
            cout<<"DES加密算法"<<endl;
        }   
    private:

};

class Context{  //组合算法的抽象类
    public:
        void setStrategy(Strategy *strategy){
            this->strategy = strategy;
        }
        void myoperator(){
            strategy->crypt();
        }

    private:
        Strategy *strategy;
};
int main(void){
    //1、直接调用的方法;
    /*
    DES *des = new DES;
    des->crypt();
    delete des;
    */

    //2、客户端可以自由的进行策略的更换;
    //Strategy *des = new DES;
    Strategy *des = new AES;    
    Context *context = new Context;
    context->setStrategy(des);
    context->myoperator();

    delete des;
    delete context;

    return 0;
}

  (2)、运行结果

wKiom1hfMZ3j-1y6AAA491mBLz0762.png-wh_50