C++之设计模式

C语言状态机(求单词的个数)

以空格为界限,求单词的个数

#define BEGIN    0
#define IN_WORD  1
#define OUT_WORD 2 
int StrToWord(const char* str)
{
    int sum = 0;
    int tag = BEGIN;
    for (const char* p = str; *p != '\0'; ++p)
    {
        switch (tag)
        {
        case BEGIN:
            if (isalpha(*p))
            {
                tag = IN_WORD;
            }
            else
            {
                tag = OUT_WORD;
            }
            break;
        case IN_WORD:
            if(isalnum(*p)||*p=='\''||*p=='-'){}
            if (!isalpha(*p))
            {
                sum++;
                tag = OUT_WORD;
            }
            break;
        case OUT_WORD:
            if (isalpha(*p))
            {
                tag = IN_WORD;
            }     
            break;
        }
        if (tag == IN_WORD)
        {
            sum++;
        }
    }
    return sum;
}

int main()
{
    char str[] = { "yhping   23 hello's new data   print using" };
    int num = StrToWord(str);
    cout << num << endl;
    return 0;
}

状态模式

例题:井底下有一只青蛙,一位小女孩和青蛙kiss之后,青蛙变为了王子,如果小女孩不情愿,则青蛙变为小狗

class Creature
{
    class State
    {
    public:
        virtual string response() = 0; // 纯虚函数   // 
    };
    class Forg : public State
    {
    public:
        virtual string response() { return "Ribbet ! "; }
    };
    class Prince : public State
    {
    public:
        virtual string response() { return "Darling ! "; }
    };
    class Dog : public State
    {
    public:
        virtual string response() { return "wang wang ! "; }
    };
private:
     State *pstate;
public:
    Creature() :pstate(new Forg()) {}
    ~Creature() { delete pstate; }
    void greet()
    {
        cout << pstate->response() << endl;
    }
    void kiss()
    {
        delete pstate;
        srand(time(nullptr));
        if (rand() % 2 == 0)
        {
           pstate = new Prince();
        }
        else
        {
            pstate = new Dog();
        }
        
    }

};
int main()
{
    Creature ca;
    ca.greet();
    ca.kiss();
    ca.greet();
    return 0;
}

职责量模式

一个小女孩过生日,问爸爸要生日礼物,爸爸没给,然后继续问妈妈要,妈妈也没给,继续问爷爷要,爷爷也没给,直到问奶奶要,奶奶把生日礼物给她了

#include<iostream>
#include<ctype.h> 
#include<vector> 
using namespace std;
enum Answer { NO, YES };

class GimmeStrategy
{
public:
    virtual Answer canIHave() = 0;
    virtual ~GimmeStrategy() {}
};
class AskMom : public GimmeStrategy
{
public:
    virtual Answer canIHave()
    {
        cout << " Mooom ? Can I have this ? " << endl;
        return NO;
    }
};
class AskDad : public GimmeStrategy
{
public:
    virtual Answer canIHave()
    {
        cout << " Mad? Can I have this ? " << endl;
        return NO;
    }
};

class AskCrandpa : public GimmeStrategy
{
public:
    virtual Answer canIHave()
    {
        cout << " Grandpa ? Can I have this ? " << endl;
        return NO;
    }
};

class AskGrandma : public GimmeStrategy
{
public:
    virtual Answer canIHave()
    {
        cout << " Grandma ? Can I have this ? " << endl;
        return YES;
    }
};

class Gimme : public GimmeStrategy
{
private:
    std::vector<GimmeStrategy*> chian;
public:
    Gimme()
    {
        chian.push_back(new AskMom());
        chian.push_back(new AskDad());
        chian.push_back(new AskCrandpa());
        chian.push_back(new AskGrandma());
    }
    Answer canIHave()
    {
        for (auto  p : chian)
        {
            if (p->canIHave() == YES)
            {
                return YES;
            }
            cout << "whiiiiine !" << endl;
        }
        return NO;
    }
};
int main()
{
    Gimme chain;
    chain.canIHave();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡蓝色的经典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值