C++设计模式

5.1C语言的状态基

该程序实现统计一个字符串中的单词的个数,对于not's和new-data都作为一个单词。

#include
#define BEGIN    0
#define IN_WORD  1
#define OUT_WORD 2 
int StrToWord(const char* str)
{
	assert(str != nullptr);
	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 (isalpha(*p) || *p == '-' || *p == '\'')
			{}
			else
			{
				tag = OUT_WORD;
				sum += 1;
			}
		break;
		case OUT_WORD:
			if (isalpha(*p))
			{
				tag = IN_WORD;
			}
			break;
		}
	}
	if (tag==IN_WORD)
	{
		sum += 1;
	}
	return sum;
}
int main()
{
	char str[] = { "23 hello  not's  new-data" };
	int num = StrToWord(str);
	cout << num << endl;
	return 0;
}

5.2C++状态设计模式之青蛙变王子

一个青蛙是呱呱叫在被小女孩kiss后,有一半几率变成王子是叫达林,另一半概率变成狗是汪汪叫。

class Creature
{
	class State
	{
	public:
		virtual string response() = 0;
		void Print() { cout << "State" << endl; }
		virtual ~State() { cout << "Destroy State" << endl; }
	};
	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(0));//设计随机种子随时间变化每次种子都不相同,否则下面的代码为伪随机
		if (rand() % 2 == 0)
		{
			pstate = new Prince();
		}
		else
		{
			pstate = new Dog();
		}
	}
};
int main()
{
	Creature ca;
	ca.greet();
	ca.kiss();
	ca.greet();
	return 0;
}

5.3职责链设计模式之请求应答

一个Gimme依次问她妈、爸、爷、奶请求要礼物,如果有一个人回应YES应答则结束,否则Gimme继续问下一个人请求要礼物,直到所有人请求完。

#include
#include 
#include 
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 chian;
public:
	Gimme()
	{
		chian.push_back(new AskMom());
		chian.push_back(new AskDad());
		chian.push_back(new AskCrandpa());
		chian.push_back(new AskGrandma());
	}
    ~Gimme()
    {
        for (auto& p : chian)
		{
			delete p;
			p = nullptr;
		}
		chian.clear();
    }
	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;
}

你可能感兴趣的:(c++,设计模式)