⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command.cpp

📁 深入浅出设计模式部分C++源码。用.net2003调试通过。
💻 CPP
字号:
#include <iostream>
#include <string>
#include <cassert>

using namespace std;

class Command
{
public:
	virtual void Execute() = 0;
	virtual void Undo() = 0;
	virtual void Off() = 0;
};

class Light
{
public:
	virtual void On() = 0;
	virtual void Off() = 0;
};

class ClassRoomLight : public Light
{
public:
	virtual void On()
	{
		cout << "Class Room Light On!" << endl;
	}
	virtual void Off()
	{
		cout << "Class Room Light Off!" << endl;
	}
};

class LivingRoomLight : public Light
{
public:
	virtual void On()
	{
		cout << "LivingRoom Light on!" << endl;
	}
	virtual void Off()
	{
		cout << "LivingRoom Light Off" << endl;
	}
};


class TV
{
public:
	void On()
	{
		cout << "TV ON!" << endl;
	}
	void Off()
	{
		cout << "TV OFF!" << endl;
	}
};

class TVOnCommand : public Command
{
public:
	TVOnCommand(TV *t)
		:tv(t)
	{

	}
	virtual void Execute()
	{
		tv->On();
	}
	virtual void Undo()
	{
		tv->Off();
	}
	virtual void Off()
	{
		tv->Off();
	}

private:
	TV *tv;
};


class LightOnCommand : public Command
{
public:
	LightOnCommand(Light *l)
		:light(l)
	{

	}
	virtual void Execute()
	{
		light->On();
	}
	virtual void Undo()
	{
		light->Off();
	}
	virtual void Off()
	{
		light->Off();
	}
private:
	Light *light;
};


class RemoteControl
{
public:
	enum
	{
		COMMAND_NUM = 3
	};
	RemoteControl()
	{
		for (int i = 0; i < COMMAND_NUM; i++)
		{
			on[i] = 0;
			off[i] = 0;
		}
	}
	void SetCommand(Command* com, int slot)
	{
		assert(com != NULL && 0 <= slot && COMMAND_NUM > slot);
		on[slot] = com;
		off[slot] = com;
	}
	void OnButtonWasPressed(int slot)
	{
		assert(0 <= slot && COMMAND_NUM > slot);
		if (on[slot] != 0)
		{
			on[slot]->Execute();
		}
	}
	void OffButtonWasPressed(int slot)
	{
		assert(0 <= slot && COMMAND_NUM > slot);
		if (off[slot] != 0)
		{
			off[slot]->Off();
		}
	}
	~RemoteControl()
	{
	}
private:
	Command* on[COMMAND_NUM];
	Command* off[COMMAND_NUM];
};

int main()
{
	RemoteControl rc;
	
	///*
	LivingRoomLight lrlight;
	LightOnCommand lrcmd(&lrlight);
	rc.SetCommand(&lrcmd, 0);
	
	ClassRoomLight crlight;
	LightOnCommand crcmd(&crlight);
	rc.SetCommand(&crcmd, 1);
	//*/

	TV tv;
	TVOnCommand tvcmd(&tv);
	rc.SetCommand(&tvcmd, 2);

	rc.OffButtonWasPressed(1);
	rc.OnButtonWasPressed(2);
	rc.OnButtonWasPressed(0);
	rc.OffButtonWasPressed(0);


	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -